Хранение значений в TBlobField с использованием sql - PullRequest
1 голос
/ 12 января 2010

Я хочу хранить изображения в базе данных с помощью команд SQL, я знаю другие способы, используя TBlobField.LoadFromFile и т. Д., Но мы создаем наши собственные команды sql для обновления базы данных, поэтому мне нужно это сделать.

Как мне это сделать?

Ответы [ 4 ]

5 голосов
/ 12 января 2010

Я никогда не пробовал это (и далеко от стола в настоящее время), но параметры будут работать? например:

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-объектов

0 голосов
/ 13 января 2010
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;
0 голосов
/ 12 января 2010

Попробуйте это:

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;
0 голосов
/ 12 января 2010

Если я правильно понимаю, у вас есть какая-то система генерирования SQL вместо использования наборов данных, и вы хотите знать, как генерировать SQL для правильного выполнения INSERT или UPDATE для поля 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, если система, с которой вы работаете, поддерживает их.

...