2016-08-04 2 views
0

Я пытаюсь прочитать большой объект из базы данных PostgreSQL, используя ODBC из Visual Studio C++. Я не могу заставить его работать.PostgreSQL ODBC Visual C++ BLOB Получение?

Драйвер PostgresSQL ANSI (x64) 9.50.04.00.

Тип данных столбца является lo, созданный с:

CREATE DOMAIN lo AS oid; 

В столбце содержит объект идентификаторы крупных объектов.

Мое понимание заключается в том, что, когда водитель видит тип lo, он будет обрабатывать его как SQL_LONGVARBINARY.

Однако запрос не выполняется. Сообщение диагностика:

HY003 [Microsoft] [Диспетчер драйверов OBDC] Тип программы из диапазона

Вот код, с шумом удалены:

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); 

я могу читать обычные данные из базы данных просто отлично. И я могу читать данные 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); 
Смежные вопросы