2013-10-01 10 views
5

ich Bilder in einer Datenbank unter Verwendung von SQL speichern möchten, aber kann nicht scheinen, um es an die Arbeit:Insert/Update TBlobField (aka Bild) unter Verwendung von SQL-Parameter

qry.SQL.Clear; 
qry.Sql.Add('update tbl set pic = :blobVal where id = :idVal'); 
qry.Parameters.ParamByName('idVal')._?:=1; 

.parameters hat keine .asinteger wie .param hat aber .param ist nicht mit einem TADOQuery kompatibel - zu umgehen habe ich versucht:

a_TParameter:=qry.Parameters.CreateParameter('blobval',ftBlob,pdinput,SizeOf(TBlobField),Null); 
a_TParam.Assign(a_TParameter); 
a_TParam.asblob:=a_Tblob; 
qry.ExecSql; 

Dieses auch nicht funktioniert:

qry.SQL.Clear; 
qry.Sql.Add('update tbl set pic = :blobVal where id = 1') 
qry.Parameters.ParamByName('blobVal').LoadFromStream(img as a_TFileStream,ftGraphic);//ftblob 
//or 
qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg',ftgrafic);//ftblob 
qry.ExecSql; 
+0

einen Blick auf http://delphi.about.com/od/database/l/aa030601a.htm oder http://delphi.about.com/ Bibliothek/nosearch/npf030601.htm – RBA

Antwort

6

Shou ld so etwas wie:

qry.Parameters.Clear; 
qry.Parameters.AddParameter.Name := 'blobVal'; 
qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg', ftBlob); 
// or load from stream: 
// qry.Parameters.ParamByName('blobVal').LoadFromStream(MyStream, ftBlob); 
qry.Parameters.AddParameter.Name := 'idVal'; 
qry.Parameters.ParamByName('idVal').Value := 1; 
qry.SQL.Text := 'update tbl set pic = :blobVal where id = :idVal';  
qry.ExecSQL; 

Um das BLOB wieder aus der DB zu lesen:

qry.SQL.Text := 'select id, pic from tbl where id = 1'; 
qry.Open; 
TBlobField(qry.FieldByName('pic')).SaveToFile('c:\sample_2.jpg'); 
+0

Versuchte es-Fehler: Parameter Objekt falsch definiert. Inkonsistente oder unvollständige Informationen wurden zur Verfügung gestellt. – Rayman

+0

@user, Ich habe eine Bearbeitung vorgenommen (wahrscheinlich haben Sie den Parameter 'idVal' nicht angegeben). Versuche es jetzt. funktioniert gut für mich. – kobik

+0

, danke funktioniert jetzt :) – Rayman

1

Ich bin mit Lazarus, nicht Delphi, aber ich denke, seine in der Regel die gleiche Syntax. Wenn ja, hier eine kleine Verbesserung gegenüber dem Kobyks-Vorschlag:

Parameter werden automatisch hinzugefügt, wenn der SQL.Text zugewiesen wird, bevor versucht wird, den Parametern Werte zuzuweisen. Wie folgt aus:

qry.Parameters.Clear; 

qry.SQL.Text := 'update tbl set pic = :blobVal where id = :idVal';  
qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg', ftBlob); 
qry.Parameters.ParamByName('idVal').Value := 1; 
qry.ExecSQL; 
1

Ich schrieb dies als eine Antwort auf diese q, Delphi save packed record as blob in a sql database , die derzeit als Duplikat markiert, möglicherweise falsch, weil die Technik vom OP verwendet, wie in den Kommentaren beschrieben scheint korrekt zu sein. Also kann die Ursache des Problems woanders liegen.

Wenn das Duplicate-Flag entfernt wird, werde ich diese Antwort dort erneut posten.

Der folgende Code funktioniert gut für mich gegen eine Sql-Server-Tabelle definiert wie unten dargestellt.

Die Daten von Rec1 werden in der Tabelle gespeichert und korrekt in Rec2 zurückgelesen.

(* MS Sql Server DDL 
CREATE TABLE [blobs] (
    [id] [int] NOT NULL , 
    [blob] [image] NULL , 
    CONSTRAINT [PK_blobs] PRIMARY KEY CLUSTERED 
    (
    [id] 
) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
GO 
*) 

TForm1 = class(TForm) 
    ADOConnection1: TADOConnection; 
    qBlobInsert: TADOQuery; 
    qBlobRead: TADOQuery; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
[...] 


type 
    TMyRecord = packed record 
    FontName: string[30]; 
    FontSize: word; 
    FontColor: integer; 
    FontStyle: word; 
    Attachement: string[255]; 
    URL: string[255]; 
    end; 

const 
    scInsert = 'insert into blobs(id, blob) values(:id, :blob)'; 
    scSelect = 'select * from blobs where id = %d'; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    TestInsert; 
end; 

procedure TForm1.TestInsert; 
var 
    Rec1, 
    Rec2 : TMyRecord; 
    MS : TMemoryStream; 
begin 
    FillChar(Rec1, SizeOf(Rec1), #0); 
    FillChar(Rec2, SizeOf(Rec2), #0); 

    Rec1.FontName := 'AName'; 
    Rec1.URL := 'AUrl'; 

    MS := TMemoryStream.Create; 
    try 
    // Save Rec1 using an INSERT statement 

    MS.Write(Rec1, SizeOf(Rec1)); 
    MS.Seek(0, soFromBeginning); 
    qBlobInsert.Parameters[0].Value := 1; 
    qBlobInsert.Parameters[1].LoadFromStream(MS, ftBlob); 
    qBlobInsert.SQL.Text := scInsert; 
    qBlobInsert.ExecSQL; 


    // Read saved data back into Rec2 

    qBlobRead.SQL.Text := Format(scSelect, [1]); 
    qBlobRead.Open; 
    MS.Clear; 
    TBlobField(qBlobRead.FieldByName('blob')).SaveToStream(MS); 
    MS.Seek(0, soFromBeginning); 
    MS.Read(Rec2, MS.Size - 1); 
    Caption := Rec2.FontName + ':' + Rec2.URL; 
    finally 
    MS.Free; 
    end; 
end; 

Auszug aus DFM

object qBlobInsert: TADOQuery 
    Connection = ADOConnection1 
    Parameters = < 
    item 
     Name = 'id' 
     DataType = ftInteger 
     Value = Null 
    end 
    item 
     Name = 'blob' 
     DataType = ftBlob 
     Value = Null 
    end> 
    Left = 56 
    Top = 32 
end 
Verwandte Themen