求救如题:
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发现传递参数值时'张三'变为'??',因此查询结果自然为空,求解决方案,新手分不多,折腾一天了,没解决,请各位高手指教。
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发现传递参数值时'张三'变为'??',因此查询结果自然为空,求解决方案,新手分不多,折腾一天了,没解决,请各位高手指教。
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却不行啊
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;
试用后也不行
s := '张三';
Parameters.ParamByName('FiledName').Value := s;
试试吧