アプリケーションから SQLColAttribute を呼び出すときに SQL_INVALID_HANDLE エラーが発生します (自己開発の odbc ドライバーと通信しようとしています)。ハンドルが無効なハンドルであると述べられている理由がわかりません。単純な構造体であり、実行時にまだ有効であるためです。それをチェックしました。ドライバーは非ユニコードドライバーであり、非ユニコードテストアプリケーションから使用しています。
ドライバーも設定を管理します(ドライバーからのログ)
SQLGetStmtAttr called:
Attribute to set is: SQL_ATTR_APP_ROW_DESC
SQLGetStmtAttr called:
Attribute to set is: SQL_ATTR_APP_PARAM_DESC
SQLGetStmtAttr called:
Attribute to set is: SQL_ATTR_IMP_ROW_DESC
SQLGetStmtAttr called:
Attribute to set is: SQL_ATTR_IMP_PARAM_DESC
sqlprepare を呼び出す前に適切に
ドライバー マネージャーのログ:
ODBC_Test 2210-151c ENTER SQLAllocHandle
SQLSMALLINT 1 <SQL_HANDLE_ENV>
SQLHANDLE 0x00000000
SQLHANDLE * 0x002EFCC0
ODBC_Test 2210-151c EXIT SQLAllocHandle with return code 0 (SQL_SUCCESS)
SQLSMALLINT 1 <SQL_HANDLE_ENV>
SQLHANDLE 0x00000000
SQLHANDLE * 0x002EFCC0 ( 0x003541C8)
ODBC_Test 2210-151c ENTER SQLSetEnvAttr
SQLHENV 0x003541C8
SQLINTEGER 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER 3 <SQL_OV_ODBC3>
SQLINTEGER 0
ODBC_Test 2210-151c EXIT SQLSetEnvAttr with return code 0 (SQL_SUCCESS)
SQLHENV 0x003541C8
SQLINTEGER 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER 3 <SQL_OV_ODBC3>
SQLINTEGER 0
ODBC_Test 2210-151c ENTER SQLAllocHandle
SQLSMALLINT 2 <SQL_HANDLE_DBC>
SQLHANDLE 0x003541C8
SQLHANDLE * 0x002EFCA8
ODBC_Test 2210-151c EXIT SQLAllocHandle with return code 0 (SQL_SUCCESS)
SQLSMALLINT 2 <SQL_HANDLE_DBC>
SQLHANDLE 0x003541C8
SQLHANDLE * 0x002EFCA8 ( 0x00354250)
ODBC_Test 2210-151c ENTER SQLConnectW
HDBC 0x00354250
WCHAR * 0x00352EB8 [ 5] "dsn01"
SWORD 5
WCHAR * 0x55128B34 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x55128B34 [ -3] "******\ 0"
SWORD -3
ODBC_Test 2210-151c EXIT SQLConnectW with return code 0 (SQL_SUCCESS)
HDBC 0x00354250
WCHAR * 0x00352EB8 [ 5] "dsn01"
SWORD 5
WCHAR * 0x55128B34 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x55128B34 [ -3] "******\ 0"
SWORD -3
ODBC_Test 2210-151c ENTER SQLAllocHandle
SQLSMALLINT 3 <SQL_HANDLE_STMT>
SQLHANDLE 0x00354250
SQLHANDLE * 0x002EF6F8
ODBC_Test 2210-151c EXIT SQLAllocHandle with return code 0 (SQL_SUCCESS)
SQLSMALLINT 3 <SQL_HANDLE_STMT>
SQLHANDLE 0x00354250
SQLHANDLE * 0x002EF6F8 ( 0x00355790)
ODBC_Test 2210-151c ENTER SQLPrepare
HSTMT 0x00355790
UCHAR * 0x00DB89C8 [ 72] "select COUNTRYFR,CITYFROM,CITYTO from SPFLI where CITYFROM EQ 'NEW YORK'"
SDWORD 72
ODBC_Test 2210-151c EXIT SQLPrepare with return code 0 (SQL_SUCCESS)
HSTMT 0x00355790
UCHAR * 0x00DB89C8 [ 72] "select COUNTRYFR,CITYFROM,CITYTO from SPFLI where CITYFROM EQ 'NEW YORK'"
SDWORD 72
ODBC_Test 2210-151c ENTER SQLColAttribute
SQLHSTMT 0x00355790
SQLSMALLINT 1
SQLSMALLINT 14 <SQL_DESC_TYPE_NAME>
SQLPOINTER 0x002EF6B0
SQLSMALLINT 50
SQLSMALLINT * 0x002EF6A4
SQLPOINTER 0x00000000 (NYI)
ODBC_Test 2210-151c ENTER SQLColAttribute
SQLHSTMT 0x00C05200
SQLSMALLINT 1
SQLSMALLINT 14 <SQL_DESC_TYPE_NAME>
SQLPOINTER 0x002EF6B0
SQLSMALLINT 50
SQLSMALLINT * 0x002EF6A4
SQLPOINTER 0x00000000 (NYI)
ODBC_Test 2210-151c EXIT SQLColAttribute with return code -2 (SQL_INVALID_HANDLE)
SQLHSTMT 0x00C05200
SQLSMALLINT 1
SQLSMALLINT 14 <SQL_DESC_TYPE_NAME>
SQLPOINTER 0x002EF6B0
SQLSMALLINT 50
SQLSMALLINT * 0x002EF6A4
SQLPOINTER 0x00000000 (NYI)
ODBC_Test 2210-151c EXIT SQLColAttribute with return code -2 (SQL_INVALID_HANDLE)
SQLHSTMT 0x00355790
SQLSMALLINT 1
SQLSMALLINT 14 <SQL_DESC_TYPE_NAME>
SQLPOINTER 0x002EF6B0
SQLSMALLINT 50
SQLSMALLINT * 0x002EF6A4
SQLPOINTER 0x00000000 (NYI)
テスト プログラムは非常に単純です。
SQLHANDLE hEnv ;
SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv ) ;
SQLSetEnvAttr( hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 ) ;
SQLHANDLE hConn ;
SQLAllocHandle( SQL_HANDLE_DBC, hEnv, &hConn );
SQLCHAR* dsnName = (SQLCHAR*)"dsn01" ; // MUST BE THE SAME
SQLCHAR* userid = (SQLCHAR*)"nodata\0";
SQLCHAR* password = (SQLCHAR*)"nodata\0";
SQLConnect(
hConn,
dsnName,
5,
userid,
SQL_NTS,
password,
SQL_NTS);
HSTMT hStmt ;
SQLAllocHandle( SQL_HANDLE_STMT, hConn, &hStmt ) ;
SQLCHAR* query = (SQLCHAR*)"select COUNTRYFR,CITYFROM,CITYTO from SPFLI where CITYFROM EQ 'NEW YORK'";
SQLPrepare(hStmt,query,strlen((const char*)query));
SQLCHAR TypeName[50];
SQLSMALLINT TypeNameLen;
SQLColAttribute((SQLHSTMT)hStmt,1,SQL_DESC_TYPE_NAME,TypeName, sizeof(TypeName),&TypeNameLen,NULL);
SQLColAttribute が SQL_INVALID_HANDLE を返す原因を知っている人はいますか? msdn を読みましたが、有用なものは何もありませんでした。