Autor Beitrag
spacemanspiff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Di 28.12.10 10:43 
Hallo,

ich möchte gerne ein Integer-Array in einem BLOB-Datenbankfeld speichern. Aber leider habe ich keinen Schimmer, ob ich das überhaupt so ohne weiteres machen kann, oder ob ich erst das Array in einer Datei speichern muss, um diese mit einem FileStream einzulesen, in einen BlobStream zu kopieren, um ihn dann in der DB abzulegen. Gleiches gilt dann hinterher für das Auslesen der Daten aus der DB. Die Suche hier im Forum und bei Gockel.de hat mich leider nicht weiter gebracht. Auch die Suche in der Hilfe scheint keine Methoden geliefert zu haben, die das bewerkstelligen können. Ich dachte zunächst, dass ich die Aufgabe mit ReadBuffer / WriteBuffer lösen kann, aber da kommt bei mir eine Zugriffsverletzung...

Die konkrete Frage wäre nun:

Wie schaffe ich mein Integer-Array in ein Stream-Objekt? (Umweg über temp-Datei??)

Danach könnte ich das ja in ein BlobStream umkopieren und in der DB ablegen. Ich gehe auch mal davon aus, dass ich die Daten ähnlich wieder auslesen kann. Nur muss ich sie erst mal reinbekommen :-)

Vielen Dank und beste Grüße,
Thomas

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hier mal mein Code, der das Array erzeugt und ihn in das StreamObjekt schreiben soll... aber wie gesagt folgt darauf eine Zugriffsverletzung...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
    var IntArray: Array[1..720of Smallint;
        TempStream: TFileStream;

...

    for k := 1 to 720 do
    begin
      IntArray[k] := Byte( filestring[j] );
      temp := Byte( filestring[j+1] );
      temp := temp shl 8;
      IntArray[k] := IntArray[k] + temp;
      j := j + 2;
    end;
    with TempStream do
    begin
      Position := 0;
      WriteBuffer( IntArray, SizeOf( IntArray ) );
    end;



Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 28.12.2010 um 10:31
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Di 28.12.10 11:12 
Probier mal:
ausblenden Delphi-Quelltext
1:
  WriteBuffer( IntArray[0], SizeOf( IntArray ) );					
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Di 28.12.10 11:25 
Hallo und danke,

aber das klappt nicht

auch das hier nicht
ausblenden Delphi-Quelltext
1:
WriteBufer( IntArray[1], SizeOf( IntArray ) );					


und dieses hier auch nicht
ausblenden Delphi-Quelltext
1:
2:
3:
4:
for k = 1 to 720 do
begin
  WriteBuffer( IntArray[k], SizeOf( Smallint ) );
end;


Verstehe ich nicht... ist Delphi ein statisches Array vielleicht nicht konstant genug??
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 28.12.10 11:41 
Hey,

benutz den MemoryStream:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var MemStream: TMemoryStream;

MemStream := TMemoryStream.Create;
MemStream.Write(IntArray[1], SizeOf(IntArray)); //schreiben
MemStream.Read(IntArray[1], SizeOf(IntArray));  //lesen
//weitere Arbeiten
MemStream.Free;

das Ganze geht natürlich nur mit einem statischen Array.

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: spacemanspiff
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 28.12.10 11:42 
Moin!

user profile iconspacemanspiff hat folgendes geschrieben Zum zitierten Posting springen:
ich möchte gerne ein Integer-Array in einem BLOB-Datenbankfeld speichern.
Hm, muss man dazu zwingend einen Stream haben? :gruebel: Hängt wohl von der DB-Kompo ab... ? :nixweiss: Wenn dem so ist, stellt sich eher die Frage, warum du dann beim Auslesen der "Textdatei" nicht gleich einen TMemoryStream für die binären Daten verwendest, statt ein Array. :idea: ;)

user profile iconspacemanspiff hat folgendes geschrieben Zum zitierten Posting springen:
Wie schaffe ich mein Integer-Array in ein Stream-Objekt? (Umweg über temp-Datei??)
Sofern es nicht um Gigabytes geht, ist ein FileStream sicher nicht die geeignete Wahl. :? Nimm doch einen TMemoryStream. :idea:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  var
    IntArray: Array[1..720of Smallint;
    TempStream: TMemoryStream;
begin
  TempStream := TMemoryStream.Create;
  try
    TempStream.Write(IntArray[1],Length(IntArray)*SizeOf(SmallInt));
  finally
    TempStream.Free;
So hast du die Daten im Stream. Aber warum unbedingt ein konstantes Array und dann auch noch 1-basiert? Ich dachte, die binären Daten sind nicht alle gleich lang? Dann wäre ein dynamisches Array besser (hatte ich auch in meinem Klassen-Vorschlag drin).

user profile iconspacemanspiff hat folgendes geschrieben Zum zitierten Posting springen:
Danach könnte ich das ja in ein BlobStream umkopieren und in der DB ablegen.
Warum die Daten dann nicht gleich aus der Datei in den BlobStream schieben? :gruebel:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: spacemanspiff
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Di 28.12.10 12:19 
Danke euch beiden, das hat geklappt... :-)

@Narses
- Ja, die DB-Komponente verlangt nach einem Stream-Objekt

- Ich habe die kompletten Daten in einem Array ausgelesen, weil u.a. noch Anpassungen im Datumsformat vorgenommen werden mussten. Ausserdem konnte ich so die Bytes schon mal zu Integern zusammensetzen und prüfen, ob die Werte richtig ausgelesen wurden

- Denk bitte dran, dies ist mein erstes Delphi-Projekt. Warum also nicht gleich ein TMemoryStream? Weil ich es nicht kannte :-) Muss mich erst mal rantasten und Delphi kennenlernen. In der Regel programmiere ich Assembler und C, hin und wieder Java und C++, aber für Windows-Programme steht hier halt ein Rechner mit Delphi 2010 Lizenz und bisher scheint Delphi ein hübsches Instrument zu sein. Ich hab seinerzeit noch GUI-Programme mit der WinAPI per Hand gebastelt oder in Fleißarbeit mit Java-Panels. Delphi nimmt einem hübsch viel Arbeit ab :-)

- Warum ein 1-basiertes Array? Hab nachgeschlagen, wie in Delphi Arrays deklariert werden und bin auf die Notation gestossen. Hab erst später mitbekommen, dass ich die Arrays auch auf - so wie ich es gewohnt bin - 0 laufen lassen kann

- Die binären Daten sind immer 1440 Bytes lang, es sind nur immer unterschiedlich viele relevante Daten. Um die Herauszufiltern muss man aber ein paar mathematische Funktionen drauf loslassen, dann bekommt man Intervalle und kann alles vor und hinter den Intervallen in die Tonne kloppen

- Warum nicht gleich einen Blob? Soweit ich das mitbekommen habe, muss das BlobStream-Objekt gleich bei der Instanziierung auf ne Datenbankspalte zeigen. Die Datenbank möchte ich aber in einer gekapselten Funktion ansprechen. Daher der Umweg.



Danke noch mal. Die Fragen werden hoffentlich bald weniger ;-)

Beste Grüße,
Thomas