2013-10-01 13 views
5

ama cant almak gibi çalışmak için: .Param var gibiEkle/güncelleme TBlobfield (aka resim) kullanarak sql parametreler ben sql kullanarak bir veritabanındaki görüntüleri saklamak istediğiniz

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

.Parameters hiçbir .asinteger vardır ama .Param bir TADOquery ile uyumlu değildir - denedim geçici çözüm için:

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

Bu aynı zamanda çalışmıyor:

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 veya http://delphi.about.com/ bakmak library/nosearch/npf030601.htm – RBA

cevap

6

Shou'yu

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; 

geri DB'den BLOB'u okumak için: ld şey gibi olmak ben Lazarus, değil Delphi kullanıyorum

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

Denendi Hata: Parametre nesnesi yanlış tanımlandı. Tutarsız veya eksik bilgi sağlandı. – Rayman

+0

@user, Bir düzenleme yaptım (muhtemelen "idVal" parametresini belirtmediniz). şimdi dene. Benim için iyi çalışıyor. – kobik

+0

, teşekkürler şimdi çalışıyor :) – Rayman

1

ama onun genellikle aynı sözdizimini sanırım. Eğer öyleyse, kobiks önerisi üzerinde hafif bir gelişme var:

Parametrelere değer atamaya başlamadan önce, SQL.Text atandığında parametreler otomatik olarak eklenir. Şunun gibi:

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

bu q cevap olarak yazdım, henüz kopyası olarak işaretlendi edilir Delphi save packed record as blob in a sql database , muhtemelen yanlış yorumlarla tarif edilen OP tarafından kullanılan bir tekniktir doğru olarak göründüğü için. Yani, sorunun nedeni başka bir yerde olabilir.

Yinelenen bayrak kaldırılırsa, bu cevabı orada tekrar gönderirim.

Aşağıdaki kod, aşağıda gösterildiği gibi tanımlanan Sql Server tablosuna karşı benim için iyi çalışıyor.

Rec1'deki veriler tabloya kaydedilir ve Rec2'ye doğru şekilde tekrar okunur. DFM

den

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

Özü

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 
İlgili konular