2013-10-01 56 views
5

我想存儲使用SQL數據庫中的圖像,但不能似乎得到它的工作:插入/更新TBlobfield使用(又名圖像)的SQL參數

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

.Parameters沒有.asinteger像.PARAM有但.PARAM是不與TADOquery兼容 - 要解決我想:

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

這也行不通:

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

看看http://delphi.about.com/od/database/l/aa030601a.​​htm或http://delphi.about.com/ library/nosearch/npf030601.htm – RBA

回答

6

守LD是這樣的:

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; 

要讀取BLOB從DB回:

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

試過了 - 錯誤:參數對象定義不正確。提供了一致或不完整的信息。 – Rayman

+0

@user,我做了一個編輯(你可能沒有指定'idVal'參數)。現在試試。對我來說工作得很好。 – kobik

+0

,謝謝:) – Rayman

1

我使用的拉撒路,而不是德爾福,但我想它通常是相同的語法。如果是這樣,這裏對kobiks的建議略有改進:

如果在嘗試爲參數賦值之前分配了SQL.Text,則會自動添加參數。就像這樣:

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

我寫這作爲一個答案Q, Delphi save packed record as blob in a sql database 這是目前被標記爲重複,可能是不正確的,因爲在註釋中描述的OP使用的技術 似乎是正確的。所以,問題的原因可能在於其他地方。

如果Duplicate標誌被刪除,我會在這裏重新發布這個答案。

以下代碼適用於我對照如下所示定義的Sql Server表。

來自Rec1的數據被保存到表格中並正確地讀回到Rec2中。從DFM

(* 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; 

提取

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