通过控制面板->管理工具->Event Viewer->Windows Log->Application Logs, 可以看到可以看到是如下错误

 

“C:\Windows\oraocci11d.dll”的激活上下文生成失败。 找不到从属程序集 Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"。 请使用 sxstrace.exe 进行详细诊断。

 

原因:

1. 没有安装Microsoft.VC90.DebugCRT,processorArchitecture="x86"

2. 使用了DEBUG版本的oraocci11d.lib 和oraocci11d.dll 动态链接库

 

解决办法

1. 安装Microsoft.VC90.DebugCRT

2. 或者不要使用DEBUG版本的occi 动态链接库

 

 

还有一个ResultSet->getString()的内存错误

解决办法:

  • 我用的是VC++2010, 下载与VC++2010对应的OCCI DLL库
  • 并且occi 的版本要和oci.dll版本匹配,否则可能会出现"11g无法定位程序输入点OCIPHeapAllocUc于动态连接库OCI.DLL上"的问题
  • http://www.oracle.com/technetwork/database/occidownloads-083553.html

 

总之:VC++版本, OCCI DLL版本, OCI DLL版本三者必须一致。

 

OCCI示例代码

 1 void test() {
 2 
 3 std::string userName = "scott";
 4 std::string password = "tiger";
 5 std::string connectString = "ORCL";
 6 //Environment::createEnvironment("AL32UTF8","UTF8");
 7 oracle::occi::Environment *env = oracle::occi::Environment::createEnvironment("AL32UTF8","UTF8");
 8 {
 9 oracle::occi::Connection *conn = env->createConnection(
10 userName, password, connectString);
11 oracle::occi::Statement *stmt = conn->createStatement(
12 "SELECT DEPTNO, DNAME FROM DEPT");
13 oracle::occi::ResultSet *rs = stmt->executeQuery();
14 while( rs->next() ) {
15     //oracle::occi::Blob b = rs->getBlob(1);
16      int i =rs->getInt(1);
17     std::string dn =rs->getString(2);
18     //std::cout << "Length of BLOB : " << b.length() << std::endl;
19     //std::cout << "dname : " << dname << std::endl;
20     std::cout << "deptno : " << i << std::endl;
21     std::cout << "dname : " << dn << std::endl;
22 }
23 stmt->closeResultSet(rs);
24 conn->terminateStatement(stmt);
25 env->terminateConnection(conn);
26 }
27 
28 oracle::occi::Environment::terminateEnvironment(env);
29 }