PostgreSQL ODBC Visual C ++ BLOB获取?

时间:2016-08-04 20:01:11

标签: c++ postgresql odbc

我正在尝试使用Visual Studio C ++中的ODBC从PostgreSQL数据库中读取大对象。我无法让它发挥作用。

驱动程序是PostgresSQL ANSI(x64)9.50.04.00。

列的数据类型为CREATE DOMAIN lo AS oid; ,创建时间为:

lo

该列包含大对象的对象ID。

我的理解是,当驱动程序看到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驱动程序管理器]程序类型超出范围

以下是删除了噪音的代码:

sed -i '/^ [ ,]*$/d' file

我可以很好地从数据库中读取常规数据。我可以使用Java / JDBC从数据库中读取BLOB数据,但我需要它在C ++中工作。

为什么我会收到错误,我该怎么做才能解决?

1 个答案:

答案 0 :(得分: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);