Qt如何使用OCI驱动程序而无需安装Oracle客户端

时间:2014-09-24 15:01:41

标签: qt oracle11g qt4 oci

有没有办法在不安装Oracle客户端的情况下使用Qt OCI驱动程序?在构建驱动程序时,可能使用Oracle的静态库?或者使用一些Oracle客户端dll和一些env变量设置?

问题是我不能要求我的客户在使用我的应用程序之前安装oracle客户端。他们希望我的应用程序能够毫无困难地启动和运行。

如果无法实现这一点,那么我们还有什么替代方案?

  • OS = Windows 7
  • Qt的= 4.8.6

2 个答案:

答案 0 :(得分:1)

如果有人对此感兴趣,我是如何做到的。

  1. 阅读http://docs.oracle.com/cd/B12037_01/appdev.101/b10779/oci01int.htm#423364忘记修补部分。
  2. 下载oracle即时客户端http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html。这是一个zip文件,无需安装,只需提取它包含的应用程序。 (或者我们可以在其他地方提取并将位置包含在Path env变量中)
  3. 由于现在我们没有安装客户端,因此我们也没有tnsnames.ora文件。所以直接设置ip,端口和服务名称。 (或者,如果我们想要tnsnames.ora文件,我们可以使用TNS_ADMIN env变量)例如:
  4.    o_Database.setHostName("10.10.10.225");
       o_Database.setPort(1521);
       o_Database.setDatabaseName("ora11g");
    
    1. 就是这样。它应该完美。
    2. 同时,分发Oracle即时客户端DLL是合法的。

答案 1 :(得分:0)

你想要达到什么目的?您的意图纯粹是技术性的,还是您在许可方面遇到问题? (Oracle不允许重新分发OCI库)。您使用的操作系统是什么?

在Linux / AIX上,理论上你可以创建自己的"静态" OCI库的版本。动态的一个叫做libclntsh(sh代表共享)。静态的libclntst至少可以使用Oracle的makefile手动构建。 然后,您可以在应用程序中技术上嵌入此静态库。您可能有一些缺少的符号(例如__fast_memcpy_A)。这是因为Oracle是使用英特尔的ICC编译器编译的,并且您还添加了一些ICC运行库的静态版本。

您还可以查看项目Tora。用户必须手动下载OCI库,并将所有特定于Oracle的特定代码放入单独的插件中。

更新:AFAIK Oracle不允许重新分发OCI.DLL,除非您是Oracle业务合作伙伴(或者现在这样称呼它)。

如果是Windows平台,您可以使用:

  • Microsoft的Oracle ODBC驱动程序。它应该存在于每个Windows安装中。但是这个很老,并且不支持更新的数据类型(比如LOB),也许它也不支持一些字符集。

  • 一些第三方oci-like司机。但AFAIK只适用于C#。

  • 使用某些应用程序服务器,而不是使用客户端应用程序的直接数据库连接

  • 编写自己的驱动程序。请参阅Pythian