三层结构:
中间层为ADOConnection, ADOQuery, DataSetProvider。
客户端为DCOMConnection,ClientDataSet
客户端执行的代码:
ClientDataSet2.Close;
  ClientDataSet2.CommandText := 'insert into PE_CENTER_CONFIG(CODE,NAME,ADDRESS,POST_CODE,LINKMAN,TEL,GREETING,REMARK) values(:CODE,:NAME,:ADDRESS,:POST_CODE,:LINKMAN,:TEL,:GREETING,:REMARK)';
  ClientDataSet2.Params.ParamByName('CODE').AsString      := Trim(Edit8.Text);
  ClientDataSet2.Params.ParamByName('NAME').AsString      := Trim(Edit1.Text);
  ClientDataSet2.Params.ParamByName('ADDRESS').AsString   := Trim(Edit2.Text);
  ClientDataSet2.Params.ParamByName('POST_CODE').AsString := Trim(Edit3.Text);
  ClientDataSet2.Params.ParamByName('LINKMAN').AsString   := Trim(Edit4.Text);
  ClientDataSet2.Params.ParamByName('TEL').AsString       := Trim(Edit5.Text);
  ClientDataSet2.Params.ParamByName('GREETING').AsString  := Trim(Edit6.Text);
  ClientDataSet2.Params.ParamByName('REMARK').AsString    := Trim(Edit7.Text);
  ClientDataSet2.Execute;客户端执行代码之后,写到数据库里的记录,字段内容自动被截断了,比如:要保存的内容           实际存到数据库的内容  
-----------------      -----------------------
计算机中心啊           计算机
跟踪SQL Server数据库得到以下语句:SET NO_BROWSETABLE OFFSET FMTONLY ON select CODE,NAME,ADDRESS,POST_CODE,LINKMAN,TEL,GREETING,REMARK from PE_CENTER_CONFIG SET FMTONLY OFFSET NO_BROWSETABLE ONdeclare @P1 int
set @P1=2
exec sp_prepare @P1 output, N'@P1 varchar(6),@P2 varchar(40),@P3 varchar(60),@P4 varchar(6),@P5 varchar(8),@P6 varchar(20),@P7 varchar(200),@P8 varchar(40)', N'insert into PE_CENTER_CONFIG(CODE,NAME,ADDRESS,POST_CODE,LINKMAN,TEL,GREETING,REMARK) values(@P1,@P2,@P3,@P4,@P5,@P6,@P7,@P8)', 1
select @P1exec sp_unprepare 2SET NO_BROWSETABLE OFFexec sp_executesql N'insert into PE_CENTER_CONFIG(CODE,NAME,ADDRESS,POST_CODE,LINKMAN,TEL,GREETING,REMARK) values(@P1,@P2,@P3,@P4,@P5,@P6,@P7,@P8)', N'@P1 varchar(5),@P2 varchar(4),@P3 varchar(5),@P4 varchar(5),@P5 varchar(5),@P6 varchar(5),@P7 varchar(5),@P8 varchar(5)', 'Edit8', '体检', 'Edit2', 'Edit3', 'Edit4', 'Edit5', 'Edit6', 'Edit7'SET NO_BROWSETABLE ON
SET FMTONLY ON select * from PE_CENTER_CONFIG SET FMTONLY OFF俺又测试了几次,发现后一个语句exec sp_executesql中字段长度是根据传给它的参数决定的,如:ClientDataSet2.Params.ParamByName('NAME').AsString      := Trim(Edit1.Text),如果 Edit1.text := ‘计算机中心啊’,则exec sp_executesql中的参数@P2 长度即为varchar(6),这样最终保存到数据库中的内容为” 计算机”,三个汉字,长度为6。不清楚这里的字段长度为什么不根据数据库中的字段长度来决定,而是根据所传给参数的长度。

解决方案 »

  1.   

    是字符长度,和字节长度的问题。
    exec sp_executesql中的参数@P2 长度即为varchar(6),表示有6个中文。
    数据库的长度是按照字节来的,6个中文实际上是12个字节。楼主处理一下中文的字节数量就ok。
      

  2.   

    这个问题需修改一下DataSetProvider有关取得参数值长度的函数,因为其是按字节来取得长度所以会造成汉字长度,只有应有长度的一半,网上有相关文章;
    不过建议三层最好不要用这种办法来保存数据,你可以真接用CLIENTDATASET;成批保存数据;
      

  3.   

    用sql来保存的话,直接做2层就可以啊
    三层一般通过clientdataset来增加数据,最后applyupdate提交,因为中间层可能会要处理数据