我想用SQL命令将图像存储到数据库中,我知道用TBlobField.LoadFromFile
等其他方式,但我们自己做的SQL命令来更新,这就是为什么我要做这个数据库。
我应该如何去这样做呢?
我从来没有尝试过这一点(从办公桌前的那一刻),但将参数工作?例如:
Query.Sql.Clear;
Query.Sql.Add('update myTable set myField = :blobVal where myId = :idVal');
Query.ParamByName('idVal').AsInteger := SomeId;
Query.ParamByName('blobVal').LoadFromFile(....
//or
Query.ParamByName('blobVal').LoadFromStream(....
Query.ExecSql;
这使您可以使用SQL(而不是.Edit等方法),并且仍然插入BLOB数据
如果我理解正确的话,你有某种SQL生成系统,而不是使用数据集,和你想知道如何生成SQL正确执行插入或更新到BLOB字段。
你需要什么是你的图像序列化到一个字符串的方式。例如:
function ImageToString(image: TImage): string;
var
stream: TStringStream;
begin
stream := TStringStream.Create;
try
image.SaveToStream(stream);
result := image.DataString;
finally
stream.Free;
end;
end;
一旦准备好了,把标记在你的SQL,像set IMAGE_FIELD = $IMAGE$
,然后用StringReplace与图像的字符串表示更换$IMAGE$
令牌。
或者你可以使用参数,如Graza建议,如果你正在使用的系统支持他们。
尝试这个:
Query.Sql.Clear;
Query.Sql.Add('update myTable set myField = :blobVal where myId = :idVal');
Query.ParamByName('idVal').AsInteger := SomeId;
Query.Params.CreateParam(ftBlob,'blobVal',ptInput).LoadFromFile('c:\path.png',ftGraphic);
Query.ExecSql;
jpg := TJPEGImage.Create;
jpg.Assign(Image1.Picture.Graphic);
strm := TMemoryStream.Create;
strm.Position:= 0;
jpg.SaveToStream(strm);
IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('INSERT INTO ENTRY(FORMNUM, JPG) VALUES(');
IBSQL1.SQL.Add( quotedstr(edtFormNum.Text));
IBSQL1.SQL.Add(', :JPG');
IBSQL1.SQL.Add(')');
IBSQL1.Params.ByName('JPG').LoadFromStream(strm);
IBSQL1.ExecQuery;
strm.Free;
jpg.Free;