C++ OCCI API數據庫操作之連接、返回查詢結果集為json格式


使用C++操作數據庫,轉換返回結果集為json格式,易於解析。

以下程序的編譯、運行環境:Windows 10 1803、VS2017 17.5.2(vc14)、解決方案配置:Release、解決方案平台:X86

 1 #include <iostream>
 2 #include <occi.h>
 3 #include <json.h>
 4 #pragma comment(lib,"oraocci12.lib")
 5 #pragma comment(lib,"json_vc71_libmt.lib")
 6 using namespace std;
 7 using namespace oracle::occi;
 8 
 9 int main()
10 {
11   //初始化occi對象
12   Environment *env = NULL;
13   Connection *conn = NULL;
14   Statement *stmt = NULL;
15   ResultSet *res = NULL;
16     
17   try
18   {
19     char usrName[] = "shaqima";
20     char usrPwd[] = "userpwd";
21     char connectStr[] = "10.10.82.25:1521/orcl";
22     //創建連接環境
23     env = Environment::createEnvironment();
24     //連接到數據庫
25     conn = env->createEnvironment(usrName,usrPwd,connectStr);
26     if(!conn)
27     {
28       cout <<"error: connect failed!"<<endl;
29       return 0;
30     }
31 
32     //oracle sql語句
33     char sqlStr[] = "select * from DEVICE_INFO t where t.ID=:1";
34     stmt = conn->createStatement(sqlStr);
35     //設置sql變量
36     stmt->setString(1,"1");
37     //執行sql
38     res = stmt->executeQuery();
39 
40     //初始化jsoncpp對象
41     Json::Reader reader;
42     //根節點
43     Json::Value rootNode;
44     //子節點
45     Json::Value childNode;
46 
47     int nodeNum = 0;
48     //查詢出結果集,並存入json節點
49      while(res->next())
50     {
51       childNode["Id"] = res->getInt(1);
52       childNode["AssetCode"] = res->getString(2);
53       childNode["EncryptDrive"] = res->getString(3);
54       //將子節點掛載到根節點
55       rootNode[nodeNum] = Json::Value(childNode);
56       nodeNum++;
57     }
58 
59     cout<<"使用.toStyledString()轉換為標准json格式:"<<endl;
60     cout<<rootNode.toStyledString()<<endl;
61 
62     Json::FastWriter fw;
63     cout<<"轉換成易於傳輸的josn字符串格式"<<endl;
64     cout<<fw.write(rootNode)<<endl;
65   }    
66    catch(SQLException ex)
67   {
68     cout<<"ErrorCode:"<<ex.getErrorCode()<<endl;
69     cout<<"ErrorMsg:"<<ex.getMessage()<<endl;
70   }  
71   //釋放資源
72   stmt->closeResultSet(res);
73   conn->terminateStatement(stmt);
74   env->terminateConnection(conn);
75   Environment::terminateEnvironment(env);
76 
77   system("pause");
78   return 1;
79 }

 新手指路:

1、occi.h從Oracle instantclient-sdk-12.2.0.1.0中可獲得。

OCCI 頭文件包括:occi.h、occiCommon.h、occiControl.h、occiData.h、occiObjects.h,將所有文件置於同一引用目錄下,項目中只需要引用occi.h即可。

2、oraocci12.lib是靜態庫,從Oracle instantclient-sdk-12.2.0.1.0中可獲得,使用vc14目錄下的oraocci12.lib。

3、我使用的是開源jsoncpp,從https://sourceforge.net/projects/jsoncpp/下載,jsoncpp頭文件在jsoncpp-src-0.5.0/include/json下將所有文件置於同一引用目錄下,項目中只需要引用json.h即可。

4、需要在本地計算機編譯以獲得json_vc71_libmt.lib,打開jsoncpp-src-0.5.0/makefiles/vs71/jsoncpp.sln項目,lib_json右鍵-屬性,設置編譯環境:

①“配置屬性-常規-Windows SDK版本”,與項目設置一致

②“配置屬性-常規-全程序優化”,設置為:無全程序優化

③“配置屬性-C/C++-所有選項-運行庫”,與項目設置一致

④解決方案配置、解決方案平台,與項目設置一致

編譯成功后,在jsoncpp-src-0.5.0/build/vs71/release/lib_json/下為編譯之后的文件(debug/下的為json_vc71_libmtd.lib),其中的.obj、.asm文件必須與.lib文件在同一目錄下,請注意。

使用C++ OCCI API 增、刪、改日后再研究~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM