求救如题:
form1.ADOQuery1.Close;
form1.ADOQuery1.SQL.Clear;
form1.ADOQuery1.SQL.Add('select * from users where user_name = :user_name');
form1.ADOQuery1.Parameters.ParamByName('user_name').Value:='张三';
form1.ADOQuery1.Open;如果参数user_name为数字或字母则可查询到结果,如为汉字则结果为空,表users中有"张三"值,而通过sqlplus或PB可查到:select * from users where user_name='张三';从delphi7升级到delphi2010仍如此。跟踪oracle发现传递参数值时'张三'变为'??',因此查询结果自然为空,求解决方案,新手分不多,折腾一天了,没解决,请各位高手指教。

解决方案 »

  1.   

    字符集的问题,数据库用的是什么字符集,UTF和delphi中转换一下:
    Parameters.ParamByName('FiledName').Value := UTF8Encode('张三');
      

  2.   


    谢谢,还是不行啊,跟踪结果是:
    select users.*, users."ROWID"  from users where  user_name=:1 
    position :1 type ansi fixed char value '??'
    no data found传入的参数还是变为'??' TADOQuery的SQL的属性,它是TStrings,是VCL的字符串类,它是单字节类型的, 而TADODataSet的CommandText是WideString,使双字节的字符串类型,就是unicode字符串,支持unicode,我改用TADODataSet结果也是一样。oracle为10g,nls为AMERICAN.AMERIC.US7ASCII,为什么sqlplus及PB都可以正确查到结果,delphi却不行啊
      

  3.   

    SELECT VALUE FROM SYS.NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';结果为US7ASCIISELECT VALUE FROM SYS.NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_NCHAR_CHARACTERSET';结果为AL16UTF16
      

  4.   

    查了一下delphi环境变量langdir为空,是不是与此有关啊,该怎么设置该值?
      

  5.   

    把oracle里面的环境变量调一下啊
      

  6.   

    换一下数据库连接驱动,是用微软的oracle驱动
      

  7.   

    用微软的oracle驱动可以连接数据库,但不能运行SQL语句,运行select * from users都出错,错误为"application-defined exception (code xxxxxxx) at xxxxxxx 应用oracle provide for ole db 驱动运行“select * from users 及运行select * from users where user_name =:user_name, :user_name为字母或数字”可以得出正常结果,:user_name一旦为汉字则无结果
      

  8.   

    有人找出办法如下:
     
    1.修改ADODB中代码将Result   :=   Length(PWideString(@TVarData(Value).VOleStr)^); 
                                                   改为Result   :=   Length(PAnsiString(@TVarData(Value).VOleStr)^); 
    2.在ADOQuery的BeforeOpen事件中重置TParameter的Size属性 
    procedure   TForm1.ADOQuery1BeforeOpen(DataSet:   TDataSet); 
    var 
       i:   integer; 
    begin 
       with   (DataSet   as   TCustomADODataSet)   do 
           for   i   :=   1   to   Parameters.Count   do 
               Parameters.Items[i   -   1].Size   :=   Length(Parameters.Items[i   -   1].Value); 
    end; 
    试用后也不行
      

  9.   

    没办法,改用BDE了,没出现上述问题.
      

  10.   

    s: widestring;
    s := '张三';
    Parameters.ParamByName('FiledName').Value := s;
    试试吧