OCI編程基礎篇(四) 連接數據庫的示例代碼
訪問www.tomcoding.com網站,學習Oracle內部數據結構,詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學習高技術含量的內容。
先來總結一下連接數據庫的順序和步驟。
1. 創建OCI環境句柄,OCIEnvCreate()。
2. 分配錯誤句柄,OCIHandleAlloc()。
3. 分配服務器句柄,OCIHandleAlloc()。
4. 建立與數據庫服務器的通信路徑,OCIServerAttach()。
5. 分配服務上下文句柄,OCIHandleAlloc()。
6. 把服務器句柄放入服務上下文句柄中,OCIAttrSet()。
7. 分配用戶會話句柄,OCIHandleAlloc()。
8. 設置用戶會話句柄的用戶和密碼屬性,OCIAttrSet()。
9. 開啟一個用戶會話,OCISessionBegin()。
10. 把用戶會話句柄放入服務上下文句柄中,OCIAttrSet()。
實際的代碼示例
/* 定義全局變量 */ OCIEnv *envhp = NULL; /* 環境句柄指針 */ OCIError *errhp = NULL; /* 錯誤句柄指針 */ OCIServer *svrhp = NULL; /* 服務器句柄指針 */ OCISession *usrhp = NULL; /* 用戶會話句柄指針 */ OCISvcCtx *svchp = NULL; /* 服務上下文句柄指針 */ /* * Oralce數據庫ip地址為192.168.10.110,端口為1521,服務名為orcl * 數據庫用戶名為scott,密碼為tigger * 以上面的信息為例,連接到數據庫 */int connect_oracle(void){ sword rc; char user[32]; char passwd[32]; char dblink[256]; /* 創建環境句柄 */ rc = OCIEnvCreate( &envhp, OCI_DEFAULT, (void *)NULL, NULL, NULL, NULL, (size_t)0, (void **)NULL ); if (rc != OCI_SUCCESS) { fprintf(stderr, "OCIEnvCreate() - allocate OCI env handle error !\n"); return (-1); } /* 分配錯誤句柄 */ rc = OCIHandleAlloc( (void *)envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, (void **)NULL ); if (rc != OCI_SUCCESS) { fprintf(stderr, "OCIHandleAlloc() - allocate OCI error handle error !\n"); return (-1); } /* 分配服務器句柄 */ rc = OCIHandleAlloc( (void *)envhp, (void **)&svrhp, OCI_HTYPE_SERVER, 0, (void **)NULL ); if (rc != OCI_SUCCESS) { fprintf(stderr, "OCIHandleAlloc() - allocate server handle error !\n"); return (-1); } strcpy(dblink, "//192.168.10.110:1521/orcl"); /* 建立到Oracle數據庫的通信路徑 */ rc = OCIServerAttach( svrhp, errhp, (const OraText *)dblink, strlen(dblink), OCI_DEFAULT ); if (rc != OCI_SUCCESS) { fprintf(stderr, "OCIServerAttach() - establish an access path error !\n"); return (-1); } /* 分配服務上下文句柄 */ rc = OCIHandleAlloc( (void *)envhp, (void **)&svchp, OCI_HTYPE_SVCCTX, 0, (void **)NULL ); if (rc != OCI_SUCCESS) { fprintf(stderr, "OCIHandleAlloc() - allocate service context error !\n"); return (-1); } /* 把服務器句柄放入服務上下文句柄的屬性中 */ rc = OCIAttrSet( (void *)svchp, OCI_HTYPE_SVCCTX, (void *)svrhp, 0, OCI_ATTR_SERVER, errhp ); if (rc != OCI_SUCCESS) { fprintf(stderr, "Set server attribute error !\n"); return (-1); } /* 分配用戶會話句柄 */ rc = OCIHandleAlloc( (void *)envhp, (void **)&usrhp, OCI_HTYPE_SESSION, 0, (void **)NULL ); if (rc != OCI_SUCCESS) { fprintf(stderr, "OCIHandleAlloc() - allocate session handle error !\n"); return (-1); } strcpy(user, "scott"); /* 設置認證用戶屬性 */ rc = OCIAttrSet( (void *)usrhp, OCI_HTYPE_SESSION, (void *)user, strlen(user), OCI_ATTR_USERNAME, errhp ); if (rc != OCI_SUCCESS) { fprintf(stderr, "Set user attribute error !\n"); return (-1); } strcpy(passwd, "tigger"); /* 設置認證密碼屬性 */ rc = OCIAttrSet( (void *)usrhp, OCI_HTYPE_SESSION, (void *)passwd, strlen(passwd), OCI_ATTR_PASSWORD, errhp ); if (rc != OCI_SUCCESS) { fprintf(stderr, "Set password attribute error !\n"); return (-1); } /* 開啟一個用戶會話 */ rc = OCISessionBegin( svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT ); if (rc != OCI_SUCCESS) { fprintf(stderr, "OCISessionBegin() - establish user session error !\n"); return (-1); } /* 把用戶會話句柄放入服務上下文句柄屬性中 */ rc = OCIAttrSet( (void *)svchp, OCI_HTYPE_SVCCTX, (void *)usrhp, 0, OCI_ATTR_SESSION, errhp ); if (rc != OCI_SUCCESS) { fprintf(stderr, "Set user session attribute error !\n"); return (-1); } return (0); }
學習Oracle高級知識,編寫高質量代碼,盡在www.tomcoding.com

浙公網安備 33010602011771號