2

我想使用 SQL 命令将图像存储到数据库中,我知道使用TBlobField.LoadFromFileetc 的其他方法,但是我们制作了自己的 sql 命令来更新数据库,这就是我需要这样做的原因。

我该怎么做呢?

4

4 回答 4

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 数据

于 2010-01-11T22:34:05.900 回答
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;
于 2010-01-13T06:15:45.830 回答
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 建议的参数。

于 2010-01-11T22:40:40.473 回答
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;
于 2010-01-12T19:39:53.397 回答