我想使用 SQL 命令将图像存储到数据库中,我知道使用TBlobField.LoadFromFile
etc 的其他方法,但是我们制作了自己的 sql 命令来更新数据库,这就是我需要这样做的原因。
我该怎么做呢?
我想使用 SQL 命令将图像存储到数据库中,我知道使用TBlobField.LoadFromFile
etc 的其他方法,但是我们制作了自己的 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 数据
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;
如果我理解正确,您有某种 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 建议的参数。
尝试这个:
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;