请教大家个问题 为什么我想用 clientdataset动态查询 通过 params.parambyname().value:=   传递参数怎么不行呢? 我是我客户端 DBGrid -> database-> clientdataset->soketcomnect   
服务器端:datesetprovider->adoquery->adoconnection 我试这样写的:       
  DataModule2.ClientDataSet1.Close;
  DataModule2.ClientDataSet1.CommandText:='select * from dbo.通讯录 where 单位=:pm';
  DataModule2.ClientDataSet1.Params.ParamByName('pm').Value:='上海';
  DataModule2.ClientDataSet1.Open;没有报错,dbgrid 也没数据,不知何原因?请高手给于解答……  最好能给个demo ~~~

解决方案 »

  1.   

    DataModule2.ClientDataSet1.Params.ParamByName(':pm').Value:='上海';
      

  2.   

    DataModule2.ClientDataSet1.Params.ParamByName(':pm').Value:='上海';  其中 (:pm)提示找不到, 应该不是这块的原因。还是谢谢你~!
      

  3.   

    自己顶下& 请高手解答……
      

  4.   

    设下断点,把sql语句抓出来看看有没有问题.
      

  5.   

    自己添加参数试试
    DataModule2.ClientDataSet1.Params.AddParam(param)
      

  6.   

    DataModule2.ClientDataSet1.Params.ParamByName('@pm').Value:='上海';
    参数前缀
      

  7.   

    终于定位出原因,是因为
    DataModule2.ClientDataSet1.Params.ParamByName('@pm').Value:='上海';
    传递参数为中文(上海),所以传递后会截取中文一部分,因而查询不到结果,现在问题又来了,如何让中文参数能顺利查询出结果呢? 高手指点,小弟感激不尽……
      

  8.   

    终于定位出原因,是因为
    DataModule2.ClientDataSet1.Params.ParamByName('@pm').DataType := ftWideString;DataModule2.ClientDataSet1.Params.ParamByName('@pm').Value:='上海';
      

  9.   

    DataModule2.ClientDataSet1.Params.ParamByName('@pm').DataType := ftWideString; 加了ftwidestring 后提示:undeclared identifier :'ftWideString';而我在datatype中是有 ftwidestring 宽字符类型的。{ Misc DataSet types }  TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord,
        ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,
        ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo,
        ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString,
        ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob,
        ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd);
    为什么啊?请高手解答&…… 在线等&
      

  10.   

    在单元   ADODB中改一下VarDataSize函数 unit   ADODB; 
    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)^);改为下面这句 
            Result:=Length(Value); 
            if   Result   =   0   then 
                Result   :=   -1; 
        end 
        else 
            Result   :=   SizeOf(OleVariant); 
    end; 可以把改过的文件手动加入到工程中,也可以复盖掉原来的文件,最好是把ADODB.DCU全部删除,再重编译改过后的ADODB.pas,要确保改过后ADODB.pas生效就行了 --------以上网络中搜索而来, 为什么还不行呢?