我想使用SQL命令将图像存储到数据库中,我知道使用TBlobField.LoadFromFile
等的其他方法,但是我们使用自己的sql命令来更新数据库,这就是我需要这样做的原因。
我该怎么做呢?
答案 0 :(得分:5)
我从来没有尝试过(目前远离办公桌),但参数是否有效?例如:
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数据
答案 1 :(得分:0)
如果我理解正确,你有某种SQL生成系统而不是使用数据集,并且你想知道如何生成SQL以正确地对Blob字段进行INSERT或UPDATE。
您需要的是将图像序列化为字符串的方法。例如:
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建议的参数,如果您正在使用的系统支持它们。
答案 2 :(得分:0)
试试这个:
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;
答案 3 :(得分:0)
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;