色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

c oracle blob 讀取

錢浩然1年前8瀏覽0評論

在進行編程開發時,我們常常會遇到需要從數據庫中讀取二進制數據的情況,比如Oracle數據庫中的BLOB類型數據。本文將介紹如何使用C語言從Oracle數據庫中讀取BLOB類型數據,并且通過實例進行詳細說明。

首先,我們需要了解BLOB類型數據的存儲結構。在Oracle數據庫中,BLOB類型數據是以二進制形式存儲的,而C語言中也有專門的二進制數據類型。因此,在讀取BLOB類型數據時,我們可以通過使用C語言中的二進制數據類型來處理這些數據。

下面我們來看一下具體的代碼實現。首先,我們需要連接到Oracle數據庫,這里我們使用Oracle提供的OCI API實現:

OCIEnv *envhp;
OCIError *errhp;
OCISvcCtx *svchp;
OCIStmt *stmthp;
OCIDefine *defhp;
OCILobLocator *lobp;
OCISession *usrhp;
int status = 0;
char* buffer = NULL;
int size = 0;
/*初始化OCI環境、錯誤句柄和服務句柄*/
OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL);
OCIHandleAlloc(envhp, (void *)&errhp, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(envhp, (void *)&svchp, OCI_HTYPE_SVCCTX, 0, NULL);
/*連接Oracle數據庫*/
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, server, strlen((const char *)server),
OCI_ATTR_SERVER, errhp);
OCIHandleAlloc(envhp, (void**)&usrhp, OCI_HTYPE_SESSION, 0, NULL);
OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (void*)username, strlen((const char *)username),
OCI_ATTR_USERNAME, errhp);
OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (void*)password, strlen((const char *)password),
OCI_ATTR_PASSWORD, errhp);
status = OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT);
CHECK_ERROR(status, errhp, "OCISessionBegin");
status = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (void*)usrhp, 0,
OCI_ATTR_SESSION, errhp);
CHECK_ERROR(status, errhp, "OCIAttrSet");
/*創建SQL語句*/
status = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &stmthp, OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0);
CHECK_ERROR(status, errhp, "OCIHandleAlloc");
status = OCIStmtPrepare(stmthp, errhp,(OraText *) "select image from image_table where id = :id", (ub4)strlen("select image from image_table where id = :id"), OCI_NTV_SYNTAX, OCI_DEFAULT);
CHECK_ERROR(status, errhp, "OCIStmtPrepare");

接下來我們需要定義一個OCILobLocator類型的變量來存儲BLOB類型數據,再通過OCIDefineByPos函數進行綁定,這樣就可以將數據庫中的數據存入到該變量中了:

/*定義OCILobLocator類型的變量*/
status = OCIDescriptorAlloc(envhp, (dvoid **)&lobp, OCI_DTYPE_LOB, 0, 0);
CHECK_ERROR(status, errhp, "OCIDescriptorAlloc");
/*將數據庫中的BLOB類型數據存入到OCILobLocator類型的變量中*/
status = OCIDefineByPos(stmthp, &defhp, errhp, 1, (dvoid *)0, 0, SQLT_BLOB,
(dvoid *)&lobp, (ub2 *)0, (ub2 *)0, OCI_DEFAULT);
CHECK_ERROR(status, errhp, "OCIDefineByPos");

接下來我們需要獲取OCILobLocator類型變量中的數據,并進行處理。這里我們通過OCILobGetLength函數獲取BLOB數據的長度,再通過OCILobRead函數將該數據讀取到C語言中的二進制數據類型變量中:

/*獲取BLOB數據的長度*/
status = OCILobGetLength(svchp, errhp, lobp, &size);
CHECK_ERROR(status, errhp, "OCILobGetLength");
/*分配內存空間用于存儲BLOB數據*/
buffer = (char *)malloc(size+1);
memset(buffer, 0, size+1);
/*將BLOB數據讀取到C語言中的二進制數據類型變量中*/
status = OCILobRead(svchp, errhp, lobp, &size, 1, (dvoid*)buffer, (size_t)size, (dvoid*)0, (sb4 (*)(dvoid*, CONST dvoid*, ub4, ub1))0, (ub2)0, (ub1)SQLCS_IMPLICIT);
CHECK_ERROR(status, errhp, "OCILobRead");

最后,我們需要記得釋放所有分配的內存空間和數據庫連接句柄:

/*釋放內存空間*/
if(buffer != NULL) {
free(buffer);
buffer = NULL;
}
/*釋放OCILobLocator類型變量*/
if(lobp != NULL) {
OCIDescriptorFree((dvoid *)lobp, OCI_DTYPE_LOB);
lobp = NULL;
}
/*釋放OCI環境、服務句柄和錯誤句柄*/
OCIStmtRelease(stmthp, errhp, NULL, 0, OCI_DEFAULT);
OCIHandleFree((dvoid *) stmthp, OCI_HTYPE_STMT);
OCISessionEnd(svchp, errhp, usrhp, OCI_DEFAULT);
OCIHandleFree((dvoid *) usrhp, OCI_HTYPE_SESSION);
OCIHandleFree((dvoid *) errhp, OCI_HTYPE_ERROR);
OCIHandleFree((dvoid *) svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);

通過以上步驟,我們就可以在C語言程序中讀取Oracle數據庫中的BLOB類型數據了。