SQLコマンドを使用して画像をデータベースに保存したい、TBlobField.LoadFromFile
などを使用する他の方法を知っていますが、独自のSQLコマンドを作成してデータベースを更新するため、これを行う必要があります。
これを行うにはどうすればよいですか?
SQLコマンドを使用して画像をデータベースに保存したい、TBlobField.LoadFromFile
などを使用する他の方法を知っていますが、独自の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;
これにより、(.Edit などのメソッドではなく) SQL を使用して、引き続き BLOB データを挿入できます。
これを試して:
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;
私の理解が正しければ、データセットを使用する代わりに何らかの SQL 生成システムがあり、Blob フィールドに対して正しく INSERT または UPDATE を実行するための SQL を生成する方法を知りたいと考えています。
必要なのは、画像を文字列にシリアライズする方法です。例えば:
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 が提案したようにパラメーターを使用することもできます。
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;