• 5026阅读
  • 0回复

[共享]Qt, PHP连接Oracle摘要 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-08
原文:http://hi.baidu.com/xchinux/item/26691e1b95e3505f2a3e228c


Oracle安装的是11g express edition.服务器端的字符集编码是Chinese_China.AL32UTF8. 用下面的语句可查询:
  1. select userenv('language') from dual;


客户端的编码从注册表中查询,为Chinese_China.ZHS16GBK.


Qt以前是用的Qt的oci插件来连接的,但现在Qt升级到了5.0-MinGW版本,编译Oracle的Qt SQL Driver比较麻烦,所以想办法通过ODBC来连接。

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
  2. db.setDatabaseName("DRIVER={Oracle in XE};SERVER=XE");
  3. //db.setDatabaseName("ora_test0");
  4. db.setUserName("TEST");
  5. db.setPassword("123456");
  6. //db.setPort(1521);
  7. //db.setHostName("localhost");
  8. db.open();
  9. qDebug() << db.isOpenError() << db.isOpen();



上面这段代码是连接Oracle的,通过ODBC,(注意,db.open()返回的是false,判断是否连接上不能用它,而要用db.isOpen())。但连接后会出现乱码,就是因为oracle服务器端和客户端的编码不一致。如果将客户端的编码改成和服务端的一致了,那Qt程序中字符集就正常了。


修改客户端字符集的方法是修改注册表:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_XE\NLS_LANG,将其值改成SIMPLIFIED CHINESE_CHINA.AL32UTF8,与服务器端字符集编码保持一致即可。


================================================
上面是Qt通过ODBC连接Oracle的问题。下面讲PHP的,PHP我通过PDO_OCI来连接:

  1. $dsn1 = 'oci:dbname=(DESCRIPTION =
  2.     (ADDRESS_LIST =
  3.       (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  4.     )
  5.     (CONNECT_DATA =
  6.       (SERVICE_NAME = XE)
  7.     )
  8.   )';
  9.   
  10. $dsn2 = 'oci:dbname=//localhost:1521/XE';
  11.   
  12. $pdo = new PDO($dsn2 . ';charset=utf8', "test", "123456");


上面的$dsn1和$dsn2都可以,要指定字符集编码,后面的就和普通PDO一样了。

二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个