![]() |
INSERT mit BLOB Feld
Moin Moin,
mein Problem ist es ein kleines Byte-Array beim INSERT in ein BLOB-Feld zu schreiben.
Code:
Was muß da hin wo ich die drei Fragezeichen stehen habe?
IBSQL.SQL.Text:=('insert into MYTABELLE (ID,MYFELD1,MYBLOB) values (123,'Test',???);'
IBSQL.ExecQuery; IBSQL.SQL.Text:='commit'; IBSQL.ExecQuery; IBSQL.Close; MFG Quake |
Re: INSERT mit BLOB Feld
Geht das evtl. mit einem Stream am besten oder mit FieldByName('MyBLOB')?
:roll: |
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!). |
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 |
Re: INSERT mit BLOB Feld
|
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) |
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? |
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:
Delphi-Quellcode:
Auslesen:
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;
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); |
Re: INSERT mit BLOB Feld
Ja genau, das ist das was ich suche, bloß es funzt mit IB nicht.
Code:
Ich bekomme in der 'Params'-Zeile die Fehlermeldung ':i_MyFeld1 konnte nicht gefunden werden'. :(
.
. 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; . . 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')) |
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 ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 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