【发布时间】:2016-11-11 18:06:32
【问题描述】:
我有一个简单的基本问题,我正在尝试使用Insert 语句将图像插入数据库,而其他列值也使用TADOQuery 组件。
由于代码已经由某人编写,因此我想在此处放一些虚拟示例代码,以供您对各个步骤进行澄清。
请注意,这与TQuery 组件一起工作正常,因为我用TADOQuery 组件替换TQuery,我必须只使用TADOQuery 组件来做同样的事情。
相同的代码应该适用于 SQL Server 和 Oracle 数据库。
我试图在其中插入图像的列的数据类型是 SQL Server 数据库中的 VarBinary 类型。
使用 TQuery 将图像插入表中
-
使用
TImage创建图像。msBinImgStream := TMemoryStream.Create; imgCustom := TImage.Create(self); imgJpg := TJPEGImage.Create; -
将图像转换为
TJpegImage并保存为TMemoryStream。imgJpg.Assign(imgCustom.Picture.Bitmap); imgJpg.SaveToStream(msBinImgStream); -
使用
TQuery组件的SetBlobdata属性插入数据库。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;
请告诉我,用这种方法我应该如何克服这个问题。
【问题讨论】:
-
你确定这是二进制 blob,而不是文本 blob?将图像覆盖到 base64 中会有帮助吗?
-
您是否尝试用谷歌搜索错误? google.ru/… 它告诉您的数据列在服务器级别或 ADO 级别有长度/大小限制。试试小图,合适吗?仔细检查您将图片放入的位置。
标签: delphi