三层数据库 mysql socket方式联接 ,存取图片 ,请问?现在能取不能存
三层数据库 mysql socket方式联接 ,存取图片 ,请教?现在能取不能存
用uniDAC来联接数据库
以前直接写mysql的代码如下:mysql数据表中图片字段类型是longblob
存
//图片转换大小并存入stream中的 代码可以不管它,那里的结果就是将jpg图片存到流里面,
代码这样写完全可以通过,一直运行的也挺好
现在写的程序是用三层数据库 用socket方式联接服务端与客户端
服务端 uniConnection1+UniQuery1+DataSetProvider1
DataSetProvider1的options=[poFetchBlobsOnDemand,poAllowCommandText]
客户端 SocketConnection1+clientdataset1
代码和上面的代码几乎一样,不过就是将sqlquery_zp 改成了 clientdata_zp
执行后能将 编号,代码,修改日期正确写到数据库中,但是 照片 字段大小:2位元组 (用Navicat for mysql查看没有图片写进去,如果正常的话,同一张图片字段大小应该有1727元组)
同样的数据库不用clinetdata方式写,直接用uniquery写mysql就是可以的
奇了怪了,请大伙支招
对了,用uniquery 直接写,数据表(gbk或是gb2312都行,但是uniConnection1联接中必须使用gb2312,用GBK就报错,估计与我的数据表字段名使用中文名相关吧,但是用clientdataset来作的时候,联接方式用gb2312或是gbk都是一样的结果)
------解决方案--------------------
还是推荐这个方法吧:用TBlobField(FieldByName('Exe_Bin')).LoadFromFile()加载进本地数据集-->
把本地数据库更新到服务器-->服务器再上传到数据库
实用性强些,我的两层及三层都是用这个做的
------解决方案--------------------
图像数据要转化为字符,再传输。
用uniDAC来联接数据库
以前直接写mysql的代码如下:mysql数据表中图片字段类型是longblob
存
- Delphi(Pascal) code
var bh,filename:string; fimage:TMemoryStream; begin //打开图片对话框 if openpicturedialog1.Execute =false then exit; filename:=openpicturedialog1.FileName; //将图片转换大小并存入stream fimage:=TMemoryStream.Create; ....... ....... .SaveToStreamJpeg(fimage); //将内存中的图片放入数据库中 sqlquery_zp.SQL.Text:='insert into db_zp(编号,代码,照片,修改日期) values(:a,:b,:c,:d)'; bh:='ZP'+formatdatetime('YYYYMMDDHHMMSSZZZ',NOW); sqlquery_zp.Params.ParamByName('a').Text:=bh; sqlquery_zp.Params.ParamByName('b').text:=UpperCase(sqlquery_ql.FieldValues['桥梁编码']); sqlquery_zp.Params.ParamByName('c').LoadFromstream(fimage,ftBlob); sqlquery_zp.Params.ParamByName('d').Text:=formatdatetime('YYYYMMDDHHMMSSZZZ',NOW); try sqlquery_zp.ExecSQL; except application.MessageBox(' 错误: 照片数据库添加资料失败 ','信息',MB_OK); exit; end;
//图片转换大小并存入stream中的 代码可以不管它,那里的结果就是将jpg图片存到流里面,
代码这样写完全可以通过,一直运行的也挺好
现在写的程序是用三层数据库 用socket方式联接服务端与客户端
服务端 uniConnection1+UniQuery1+DataSetProvider1
DataSetProvider1的options=[poFetchBlobsOnDemand,poAllowCommandText]
客户端 SocketConnection1+clientdataset1
代码和上面的代码几乎一样,不过就是将sqlquery_zp 改成了 clientdata_zp
执行后能将 编号,代码,修改日期正确写到数据库中,但是 照片 字段大小:2位元组 (用Navicat for mysql查看没有图片写进去,如果正常的话,同一张图片字段大小应该有1727元组)
同样的数据库不用clinetdata方式写,直接用uniquery写mysql就是可以的
奇了怪了,请大伙支招
对了,用uniquery 直接写,数据表(gbk或是gb2312都行,但是uniConnection1联接中必须使用gb2312,用GBK就报错,估计与我的数据表字段名使用中文名相关吧,但是用clientdataset来作的时候,联接方式用gb2312或是gbk都是一样的结果)
------解决方案--------------------
还是推荐这个方法吧:用TBlobField(FieldByName('Exe_Bin')).LoadFromFile()加载进本地数据集-->
把本地数据库更新到服务器-->服务器再上传到数据库
实用性强些,我的两层及三层都是用这个做的
------解决方案--------------------
图像数据要转化为字符,再传输。