使用sql在TBlobField中存储值

时间:2010-01-11 22:13:43

标签: delphi blob blobstorage

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

我该怎么做呢?

4 个答案:

答案 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;