+ -
当前位置:首页 → 问答吧 → adoquery参数赋值为汉字查询不到结果

adoquery参数赋值为汉字查询不到结果

时间:2011-08-28

来源:互联网

求救如题:
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发现传递参数值时'张三'变为'??',因此查询结果自然为空,求解决方案,新手分不多,折腾一天了,没解决,请各位高手指教。

作者: jfz2010   发布时间: 2011-08-28

字符集的问题,数据库用的是什么字符集,UTF和

delphi中转换一下:
Delphi(Pascal) code
Parameters.ParamByName('FiledName').Value := UTF8Encode('张三');

作者: gxgyj   发布时间: 2011-08-28

引用 1 楼 gxgyj 的回复:
字符集的问题,数据库用的是什么字符集,UTF和

delphi中转换一下:

Delphi(Pascal) code
Parameters.ParamByName('FiledName').Value := UTF8Encode('张三');


谢谢,还是不行啊,跟踪结果是:
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却不行啊


作者: jfz2010   发布时间: 2011-08-28

SELECT VALUE FROM SYS.NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';结果为US7ASCII

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

作者: jfz2010   发布时间: 2011-08-28