単純な基本的な問題が1つあります。ステートメントを使用して画像をデータベースに挿入しようとしていますInsert
が、他の列の値もTADOQuery
コンポーネントを使用しています。
コードはすでに誰かによって書かれているので、それぞれのステップで明確にするために、ここにいくつかのダミーのサンプルコードを置きたいと思います。
これはコンポーネントで正常に機能していたことに注意してください。コンポーネントTQuery
に置き換えTQuery
ているので、コンポーネントのみTADOQuery
を使用して同じことを行う必要があります。TADOQuery
同じコードがSQLServerとOracleデータベースで機能するはずです。
画像を挿入しようとしている列のデータ型は、SQLServerVarBinary
データベースの型です。
TQueryを使用して画像をテーブルに挿入する
を使用してイメージを作成し
TImage
ます。msBinImgStream := TMemoryStream.Create; imgCustom := TImage.Create(self); imgJpg := TJPEGImage.Create;
画像をに変換し、
TJpegImage
に保存しTMemoryStream
ます。imgJpg.Assign(imgCustom.Picture.Bitmap); imgJpg.SaveToStream(msBinImgStream);
コンポーネント
SetBlobdata
のプロパティを使用してデータベースに挿入します。TQuery
sSql := 'INSERT INTO Table_Name(Column1, Column2, Column_Image) VALUES ( ''' + Value1 + ''', ''' + Value2 + ''', :pBlob)'; qryTQuery.SQL.Add(sSQL); qryTQuery.ParamByName('pBlob').SetBlobData(msBinImgStream.Memory, msBinImgStream.Size); qryTQuery.ExecSQL;
今同じことを使用してTADOQuery
:
- 画像を作成できます。
- それをTJpegに変換し、に保存し
TMemoryStream
ます。 を使用して画像をデータベースに挿入しようとしましたが、 「文字列またはバイナリ値が切り捨てられる可能性があります」
LoadFromStream(stream, ftBlob)
というエラーが発生します。sSql := 'INSERT INTO Table_Name(Column1, Column2, Column_Image) VALUES ( ''' + Value1 + ''', ''' + Value2 + ''', :pBlob)'; qryADOQuery.SQL.Add(sSQL); qryADOQuery.Parameters.ParamByName('pBlob').LoadFromStream(msBinImgStream, ftBlob); qryADOQuery.ExecSQL;
このアプローチでこの問題をどのように克服すべきかを教えてください。