在oracle中通過ODBC API 查詢一列型別為 Interval day to second的資料時,呼叫 SQLBindCol介面時提示不支持該資料型別;我把該列型別系結為varchar,呼叫SQLFetch介面直接崩潰。查了一些資料,Interval型別在Oracle 9i中就已經支持了,請問是要怎么設定,或者是ODBC版本太低了,怎么升級?謝謝。
uj5u.com熱心網友回復:
寫的demo代碼如下:#include <Windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
int main()
{
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLHDESC hAPDdesc;
SQLHDESC hARDdesc;
SQLRETURN retcode;
SQLCHAR OutConnStr[1024];
SQLSMALLINT OutConnStrLen;
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLDriverConnect(
hdbc,
NULL,
(SQLCHAR*)"DRIVER={Oracle in OraClient11g_home1_32bit};SERVER=testoracle;UID=testoracle;PWD=123;DBQ=testoracle;",
SQL_NTS,
OutConnStr,
1024,
&OutConnStrLen,
SQL_DRIVER_NOPROMPT);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
retcode = SQLPrepare(hstmt, (SQLCHAR*)"select interval_column from TESTORACLE.DATATYPE_INTERVAL;", SQL_NTS);
retcode = SQLExecute(hstmt);
SQLINTEGER desclen;
retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_APP_ROW_DESC, &hARDdesc, SQL_IS_POINTER, &desclen);
retcode = SQLSetDescField(hARDdesc, 1, SQL_DESC_TYPE, (SQLPOINTER)SQL_INTERVAL, 0);
retcode = SQLSetDescField(hARDdesc, 1, SQL_DESC_CONCISE_TYPE, (SQLPOINTER)SQL_C_INTERVAL_DAY_TO_SECOND, SQL_IS_INTEGER); //回傳-1
retcode = SQLSetDescField(hARDdesc, 1, SQL_DESC_DATETIME_INTERVAL_CODE, (SQLPOINTER)SQL_CODE_DAY_TO_SECOND, SQL_IS_INTEGER); //回傳-1
// Bind
SQL_INTERVAL_STRUCT is;
SQLLEN cbValue;
retcode = SQLBindCol(hstmt, 1, SQL_C_INTERVAL_DAY_TO_SECOND, &is, sizeof(SQL_INTERVAL_STRUCT), &cbValue); //回傳-1,錯誤資訊:不支持該型別
// Fetch
retcode = SQLFetch(hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
}
SQLCancel(hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
system("pause");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/99336.html
標籤:開發
