在oracle中通过ODBC API 查询一列类型为 Interval day to second的数据时,调用 SQLBindCol接口时提示不支持该数据类型;我把该列类型绑定为varchar,调用SQLFetch接口直接崩溃。查了一些资料,Interval类型在Oracle 9i中就已经支持了,请问是要怎么设置,或者是ODBC版本太低了,怎么升级?谢谢。

解决方案 »

  1.   

    写的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;
    }