使用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 增、刪、改日后再研究~