Entwickler-Ecke

Datenbanken - Mit der TAdoCommand eine Binärdatei speichern...


sunnyandy - Di 09.10.07 01:44
Titel: Mit der TAdoCommand eine Binärdatei speichern...
Hallo!

Ich benutze die Ado-Komponenten, um auf eine Ms Sql-Server DB zuzugreifen.

Um meine Sql-Abfragen abzuschicken, benutze ich das TAdoCommand-Objekt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var
fs: TFileStream;
puffer: Array of Byte;
begin
FAdoCommand := TADOCommand.Create(nil);
  FAdoCommand.Connection := AdoConnection;
  FAdoCommand.CommandText := 'insert into vertrag (id, datei) VALUES (123, :datei)';
  FAdoCommand.CommandType := cmdText;

FADOCommand.Parameters.ParamByName('datei').DataType := ftBLob;
FADOCommand.Parameters.ParamByName('datei').Direction := pdInput;

// Hier Stream öffnen

fs := TFileStream.Create('j:\test.bmp', fmOpenRead);
fs.Read(Pointer(puffer)^, fs.Size);

FADOCommand.Parameters.ParamByName('datei').Value := puffer;
FAdoCommand.Execute...


Wenn ich das ausführe, öffnet Delphi zur Laufzeit das Cpu-Fenster, weil dort irgendein Fehler auftritt.
Ich habe mehrere Stunden im Netz gesucht, überall finde ich Anleitungen und Beispiele, wie ich das Abspeichern in ein Image-Feld per AdoQuery oder AdoDataSet machen kann.
Aber es muss doch auch mit der AdoCommand möglich sein oder?

Ich weiß leider nicht, ob das Pointer(puffer)^ überhaupt so richtig ist :oops: Habe Pointer bisher wirklich gemieden und weiß nicht so Recht, damit umzugehen.

Vielleicht habt ihr ja ein paar gute Tipps.
Danke! Andy


Critter - Di 09.10.07 14:51

Hi,

in der Regel wird von den Komponentenherstellen ein eigener BlobStream zur verfügung gestellt. Ich weiß momentan nicht wie das bei den ADO Komponenten aussieht aber vielleicht gibt es da einen tAdoBlobStream oder so. Dann kannst du dir den Umweg über den puffer sparen, bzw. einen beser definierten weg gehen.

Eventuell hilft dir dieses Schema [http://delphi.about.com/od/database/a/record2blob.htm] weiter. Auf diese Art haben es die meisten Datenbakkomponenten mit denen ich bisher arbeitete gelöst.

critter


sunnyandy - Di 09.10.07 19:32

Hallo,
danke für die Antwort.

Habe nun selbst die Lösung gefunden. Natürlich geht es mit der Tadocommand, ein Blob Feld zu speichern:
Jeder Parameter stellt die Methode LoadFromStream zur Verfügung, damit hat sich das Problem gelöst :lol:

Es war also doch einfacher, als ich gedacht habe...