急:请教用ODAC连接远程Oracle数据库,无法查询中文字符串的问题!!!!

时间:2021-07-04 01:24:48
   各位高手,帮帮忙吧!!!
   我的问题: 
   用ODAC连接远程Oracle数据库,delphi环境。
   Oracle数据库为10g,字符集查询得到的是AL32UTF8.
   我的代码中用的ODac 6.10.0.9,用的direct方式,连接正常没有问题.可以用select *语句查询,对任何一个表单都可以查. 
   现在的问题是: 数据库中有一个表单table1(对其他表单现象一样的) ,表中有个字段为field1,定义为可空, varchar2(100),对应的有一条记录的field1值为'测试'.    现在我在我的代码中执行如下sql查询:
        NetOraQuery.SQL.Clear;
        str:='SELECT * FROM table1 WHERE field1='+''''+'测试'+'''';
        NetOraQuery.SQL.Add(str);
        NetOraQuery.Prepare;
        NetOraQuery.Open;
        MessageDlg(Inttostr(NetOraQuery.RecordCount),   mtWarning,   [mbOk],   0);

   结果却是MessageDlg显示0,也就是NetOraQuery.RecordCount=0,各种方式都试过了,总是查不到那条记录.但是如果改成
         str:='SELECT * FROM table1 '
        ....
        NetOraQuery.Open;
        if(NetOraQuery.fieldbyname('field1').AsString='测试') then
        BasciInformationForm.Label3.Caption :=NetOraQuery.fieldbyname('field1').AsString
        else
          if(not NetOraQuery.Eof ) then
          NetOraQuery.Next;
    则可以顺利遍历到那条测试记录.不知道是怎么回事.
    看了很多帖子,怀疑可能是字符集的问题,在odac的orasession控件属性option里面有个charset,我也能通过打开oarsession的连接连到数据库,从而选择和数据库一样的AL32UTF8,但是还是没用,直接用where查不到那条记录.
     前面发的帖子有朋友说用ado连试一试,我专门又装了10g的客户端,然后用ado测试了,一点问题也没有,想怎么查就怎么查,
sql语句一样的,我从oadc相应的代码直接拷过去的.
     这个问题折磨了我3天了,一直解决不了,今天看到有文章说AL32UTF8字符集把一个汉字处理成3个字符,而不是像一般的中文字符集处理成2个字符,我个人怀疑是这个问题.但是我发过去查询命令中带'测试'这样的中文字符如果oracle服务器无法辨识,从而查不到结果的话,为什么用select * 读回来的该字段却是正确的?为什么不是乱码呢?

      请做过这样c/s结构访问远程oracle,并且查询过中文字符串的朋友帮帮忙吧,感谢感谢!!!!


        

3 个解决方案

#1


str:='SELECT   *   FROM   table1   WHERE   field1='+''''+'测试'+''''; 

可能引号使用不正确

#2


那么多引号看着头晕,用#39或QUtoSTR这样加引号看着舒服

#3


當然是用蔘數式的瞭

#1


str:='SELECT   *   FROM   table1   WHERE   field1='+''''+'测试'+''''; 

可能引号使用不正确

#2


那么多引号看着头晕,用#39或QUtoSTR这样加引号看着舒服

#3


當然是用蔘數式的瞭