Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi INSERT mit BLOB Feld (https://www.delphipraxis.net/20194-insert-mit-blob-feld.html)

Quake 14. Apr 2004 15:58


INSERT mit BLOB Feld
 
Moin Moin,

mein Problem ist es ein kleines Byte-Array beim INSERT in ein BLOB-Feld zu schreiben.

Code:
IBSQL.SQL.Text:=('insert into MYTABELLE (ID,MYFELD1,MYBLOB) values (123,'Test',???);'
IBSQL.ExecQuery;
IBSQL.SQL.Text:='commit';
IBSQL.ExecQuery;
IBSQL.Close;
Was muß da hin wo ich die drei Fragezeichen stehen habe?

MFG

Quake

Quake 15. Apr 2004 08:28

Re: INSERT mit BLOB Feld
 
Geht das evtl. mit einem Stream am besten oder mit FieldByName('MyBLOB')?
:roll:

Robert_G 15. Apr 2004 08:55

Re: INSERT mit BLOB Feld
 
Dein Vorhaben schreit förmlich nach einer Spalte, die als Collection deklariert wird. :mrgreen:
Wenn du mit Komponenten auf deine DB zugreifst, die ihre API kapseln, kannst du die Collection als Objekt in Delphi beschreiben und ganz easy als Parameter an dein Statement übergeben.
Voraussetzung dafür ist eine DB, die OOP unterstützt sowie Zugriffskomponenten ohne Mid.-ware (kein ODBC oder ADO!).

Quake 15. Apr 2004 09:49

Re: INSERT mit BLOB Feld
 
Sorry, aber ich nix verstehen :gruebel:

Ich habe doch schon eine Tabelle in einer InterBase DB und in dieser ist die ein Spalte ein BLOB Feld.
Ich füge per Code mittels SQL einen Datensatz hinzu. Das funzt auch 100pro. Ich habe jetz nur keine Plan,
wie ich mein Byte-Array in die Blob-Spalte bekomme. Das Array ist so zwischen 5 und 50 Byte groß.

ciao

CenBells 15. Apr 2004 10:20

Re: INSERT mit BLOB Feld
 
hi,

hier werden sie geholfen *g*

Gruß
Ken

Robert_G 15. Apr 2004 10:22

Re: INSERT mit BLOB Feld
 
Byte-Array? :mrgreen:
Dann speichere ihn doch als Text. ;)
Du kannst doch jedes Byte als Buchstabe ( chr(ByteArray[Index] ) in einen String schreiben. Der landet dann in deinem LOB (vielleicht wäre ein CLOB besser geeignet -> Character Large Object)

Quake 15. Apr 2004 11:26

Re: INSERT mit BLOB Feld
 
Ich probier es mal aus.

Vielen Dank schon mal. :thuimb:

Aber eine Frage noch. Gibt es Probleme mit z.B Null-Bytes (Nicht die Anzahl sondern der Wert des Bytes) im String?

Robert_G 15. Apr 2004 12:47

Re: INSERT mit BLOB Feld
 
jupp :wall:,
Das wäre ein Problem.:shock:
Der String endet beim ersten #0.

Aber du kannst den Array auch direkt in die DB schreiben (mit ADO müsste es so gehen, dürfte mit dem IB-Zeugs ähnlich ablaufen):

Schreiben:
  • xyz :Array of Byte
Delphi-Quellcode:
  With ADOQuery Do
  Begin
    SQL.Text :=
      'Insert INTO MyTabelle' + #10 +
      ' (ID, MyFeld1, MyBlob)' + #10 +
      'VALUES' + #10 +
      ' (:i_ID, :i_MyFeld1, :i_MyBlob)';
    Prepared := True;
    With Parameters Do
    Begin
      ParamByName('i_ID').Value := '1';
      ParamByName('i_MyFeld1').Value := 'Test';
      With ParamByName('i_MyBlob') Do
      Begin
        DataType := ftBlob;
        Value := xyz;
      End;
    End;
    ExecSQL;
  End;
Auslesen:

  • xyz :Array of Byte
  • i :Integer
  • OutStr :string

Delphi-Quellcode:
  With ADOQuery Do
  Begin
    SQL.Text :=
      'SELECT *' + #10 +
      'FROM  MyTabelle';
    open;
    While Not Eof Do
    Begin
      OutStr := OutStr + #10 +
        FieldByName('ID').asString + ':';
      With FieldByName('MyBlob') As TBlobField Do
      Begin
        SetLength(xyz, BlobSize);
        xyz := CurValue;
      End;
      For i := low(xyz) To high(xyz) Do
        OutStr := OutStr + #10 + ' -> ' + IntToStr(xyz[i]);
      Next;
    End;
  End;
  Delete(OutStr, 1, 1);
  ShowMessage(OutStr);

Quake 15. Apr 2004 13:29

Re: INSERT mit BLOB Feld
 
Ja genau, das ist das was ich suche, bloß es funzt mit IB nicht.

Code:
 .
 .
IBSQL.Text :=
      'Insert INTO MyTabelle' + #10 + 
      ' (ID, MyFeld1, MyBlob)' + #10 + 
      'VALUES' + #10 + 
      ' (:i_ID, :i_MyFeld1, :i_MyBlob)';
IBSQL.Prepare;
IBSQL.Params.ByName(':i_MyFeld1').Value:='Test';
IBSQL.ExecQuery;
 .
 .
Ich bekomme in der 'Params'-Zeile die Fehlermeldung ':i_MyFeld1 konnte nicht gefunden werden'. :(

Oder muss ich erst den Datensatz einfügen und danach mit Update und deiner Methode mein BLOB mit Daten füllen?

Noch eine Frage sind folgende Zeilen von der Funktion her identisch?
Code:
FieldByName('MyBlob') As TBlobField
TBlobField(FieldByName('MyBlob'))

Robert_G 15. Apr 2004 16:26

Re: INSERT mit BLOB Feld
 
Dein Parameter heißt i_MyFeld1 ohne das : !!!
Der : ist nur dafür da, damit der Paramter im Statement als solcher erkannt werden kann.
Außerdem solltes du i_MyBlob auch einen Wert übergeben ;)

Quake 16. Apr 2004 08:59

Re: INSERT mit BLOB Feld
 
ups, :oops: Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz