2016-08-04 12 views
0

Visual Studio C++からODBCを使用してPostgreSQLデータベースから大きなオブジェクトを読み取ろうとしています。私はそれを働かせることはできません。PostgreSQL ODBC Visual C++ BLOBの入手?

ドライバはPostgresSQL ANSI(x64)9.50.04.00です。

列のデータ・タイプを使用して作成、loある:

CREATE DOMAIN lo AS oid; 

カラムは、ラージ・オブジェクトのオブジェクトIDが含まれています。

私の理解では、ドライバがloタイプを見ると、それはSQL_LONGVARBINARYとして扱います。

ただし、クエリは失敗します。診断メッセージです:私ができる

wchar_t* connect0 = L"DSN=picdb;"; 

SQLHENV env; 
SQLHDBC dbc; 
SQLHSTMT stmt; 

SQLLEN sqllen = -1; 
PBYTE image = new BYTE[0]; 

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); 
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0); 
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); 
SQLDriverConnect(dbc, NULL, connect0, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); 

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); 
SQLExecDirect(stmt, L"select lo from image_list where id=964945", SQL_NTS); 
SQLFetch(stmt); 

SQLGetData(stmt, 1, SQL_LONGVARBINARY, image, 0, &sqllen); //<----- It fails here 
image = new BYTE[sqllen]; 
SQLGetData(stmt, 1, SQL_LONGVARBINARY, image, sqllen, &sqllen); 

SQLDisconnect(dbc);  
SQLFreeHandle(SQL_HANDLE_DBC, dbc); 
SQLFreeHandle(SQL_HANDLE_ENV, env); 

:ここ

HY003 [Microsoft]の[OBDCドライバマネージャ]プログラム・タイプの範囲外

はノイズ削除とコードでありますデータベースから正常なデータを読み込んでください。また、BLOBデータはJava/JDBCでデータベースから読み取ることができますが、C++で動作する必要があります。

なぜエラーが発生するのですか?それを修正するにはどうすればよいですか?

答えて

0

これは動作するようです:

wchar_t* connect0 = L"DSN=picdb;"; 

SQLHENV env; 
SQLHDBC dbc; 
SQLHSTMT stmt; 

SQLLEN sqllen = -1; 
PBYTE image = new BYTE[0]; 

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); 
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0); 
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); 
SQLDriverConnect(dbc, NULL, connect0, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); 

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); 
SQLExecDirect(stmt, L"select lo from image_list where id=964945", SQL_NTS); 
SQLFetch(stmt); 

SQLGetData(stmt, 1, SQL_C_BINARY, image, 0, &sqllen); 
image = new BYTE[sqllen]; 
SQLBindParameter(stmt, 1, SQL_PARAM_OUTPUT, SQL_C_BINARY, SQL_LONGVARBINARY, 0, 0, image, sqllen, NULL); 
SQLGetData(stmt, 1, SQL_C_BINARY, image, sqllen, &sqllen); 

SQLDisconnect(dbc);  
SQLFreeHandle(SQL_HANDLE_DBC, dbc); 
SQLFreeHandle(SQL_HANDLE_ENV, env); 
関連する問題