q为TClientDataSet,
log表为Sql Server数据库中的一个表,其中name为nvarchar字段,edi为varchar字段
    q.Close;
    q.CommandText:='Insert into log(name,edi) values(:c,:b)';
    q.Params.ParamByName('c').Value:='我们朋友';
      q.Params.ParamByName('b').Value:='我们';    try
       q.Execute;
       showMessage('ok');
    finally
       q.Close;
    end;
这样存入数据库中后,name 字段的内容为“我们”,edi字段的内容为“我”。
如果存入的字符为汉字,就只能存入一半。如果存入的字符为英文字母就能够存完整。
我在oracle数据库中使用没有这个问题。
如果不用三层结构也没有这个问题。
现在不知道是Sql server的问题还是三层结构的问题,在sql server 中怎么解决这个问题?
不知道大家有没碰到过这个问题

解决方案 »

  1.   

    这是Widestring和string引起的。简单方法就是在‘我们'后加两空格
    ’我们朋友'后加4空格
      

  2.   

    老问题了,这是Widestring和string引起的同意
      

  3.   

    1.是我不用3层结构就没有上面的问题啊,这是怎么回事?
    2.我打算客户端不做修改,有没有办法解决widestring和string的问题啊
    3.我用oracle数据库怎么没有上面的问题?
      

  4.   

    我不同意楼上,我用了好几年怎么从来没见这样的问题,看看是不是因为 Name 字段类型是 nVarchar 原因导致的吧。
      

  5.   

    我直接用ado 存取汉字就能够存完整,也不需要在汉字后面添加空格。但是我用dcom三层结构就必须在汉字后面加空格才能保存完整。这是什么原因啊?
    我把name字段类型改为varchar也是同样的问题。
    请高手指导,分嫌少我再加
      

  6.   

    这个问题一直没有解决,我只好放弃使用SQL SERVER了,我知道加空格是可以的,但是我要是有一大段不确定的中文我哪知道要加多少空格啊
      

  7.   

    解决办法:不用参数,直接写SQL语句,例如:
    q.Close;
    q.CommandText:='Insert into log(name,edi) values('''+'我们朋友'+''''+','''+'我们'+''''+')';
    就可以了。
      

  8.   

    以前记得谁在论坛上提到过这个BUG,跟踪了一下,把它找出来了.
    ADODB.PAS单元
    //-----------------------------------------------------
    function VarDataSize(const Value: OleVariant): Integer;
    begin
      if VarIsNull(Value) then
        Result := -1
      else if VarIsArray(Value) then
        Result := VarArrayHighBound(Value, 1) + 1
      else if TVarData(Value).VType = varOleStr then
      begin
        Result := Length(PWideString(@TVarData(Value).VOleStr)^);
                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这句的问题,
        if Result = 0 then
          Result := -1;
      end
      else
        Result := SizeOf(OleVariant);
    end;//---------------------------------------------------
    也真是的,这个BUG在DELPHI6,DELPHI7都存在.
      

  9.   

    多谢各位了,终于找到解决这个问题的办法,特别感谢zzllabc、halfdream