多层数据库的存取问题。(100分)

  • 主题发起人 主题发起人 pander
  • 开始时间 开始时间
P

pander

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个三层结构中要存取一系列的DOC文件。
部分代码如下:(DM是数据模块,CDS1是clientdataset组件)
Stream:=Tmemorystream.Create;
Stream.LoadFromFile('xxx.doc');
DM.CDS1.Close;
DM.CDS1.CommandText:='insert into data (code,type,data) values(:CODE,:TYPE,:DATA)';
DM.CDS1.Params[0].Value:='0005';
DM.CDS1.Params[1].Value:=3;
stream.Seek(0,soFromBeginning);
DM.CDS1.Params[2].LoadFromStream(STREAM,ftBlob);
DM.CDS1.Execute;
Stream.Free;
结果发现文件根本不能完整地存进去,因为导出来的文件大小都是8K.
而这段代码在两层结构(ODBC)中没有任何问题,也能正确的导出来。
三层中服务器程序也是通过odbc连接的,客户端与服务器端通过socket连接。
谢谢。
 
StreamToVariant(Stream, aVariant);
DM.CDS1.Params[2].Value = aVariant;
传的是变体
 
报错啦。“变量或者类型不正确,或者不在可以接受的范围之内,要不就是与其它数据冲突”
怎么办啊。。
 
我也有类似的经历,最惨的是没什么有用的回答。也许是我提供的信息不够。
后来我用了个很土的办法蒙混过关。如果你实在找不到更好的解决办法,不
妨试试。
1)首先,往数据库插入一条新记录,其中Blob字段暂时为空(或其它),并取
 得记录ID,如你的Code
2)接着,按Code取出刚插入的记录,并修改(BCB示例如下,RemarkID相当于
你的Code),顺便说一下,CMod->cdsRemark的FetchOnDemand=false,否则
可能会出现怪问题,错误中有"no record"、"key"字样(我这出现过)
CMod->cdsRemark->Close();
CMod->cdsRemark->Params->Clear();
//sql语句里一定要有关键索引,你的Code是索引吧,如没有可能导致多个其它记录被一同更新
   //也就是说你的数据表最好有个主索引,且更新语句中包含这个索引。
CMod->cdsRemark->CommandText="Select RemarkID,Remark From Remarks Where RemarkID="+IntToStr(iRemarkID);
CMod->cdsRemark->Open();
CMod->cdsRemark->Edit();
((TBlobField*)(CMod->cdsRemark->Fields->FieldByName("Remark")))->LoadFromFile("文件名");
CMod->cdsRemark->Post();
   CMod->cdsRemark->ApplyUpdates(-1);//更新数据到数据库
试试吧,也许有效,改成Delphi不难吧
 
现在我只能用sql语句,用clientdataset的post和applyupdates也是完全没有问题的。
我就不明白是为什么?
下面的两段代码大家看看有什么不一样的地方,小弟谢谢各位乐。
代码段一:
DM.CDS1.CommandText:='select * from data where code=''0006'' ';
DM.CDS1.Open;
DM.CDS1.Edit;
TBlobField(DM.CDS1.FieldByName('DATA')).LoadFromStream(stream);
DM.CDS1.Post;
DM.CDS1.ApplyUpdates(-1);
代码段二:
DM.CDS1.CommandText:='insert into data values(''0006'',3,:DATA)';
Stream.Position:=0;
DM.CDS1.Params[0].LoadFromStream(STREAM,ftBlob);
DM.CDS1.Execute;
第一段能正确执行,导出来的文件也是正确的。
第二段运行期无错误提示,导出来的文件不正确,导出来的都只有8字节

不知道那位大虾还遇到过这样的问题,怎么解决的?
 
呵呵,第二段儿程序我怎么看不懂啊~~`~~ 关注一下
 
后退
顶部