2

アプリケーションから 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 を読みましたが、有用なものは何もありませんでした。

4

2 に答える 2

2

sqlucode.h で次の宣言を参照してください。

// UNICODE versions
#ifdef _WIN64
SQLRETURN SQL_API SQLColAttributeW
(
    SQLHSTMT        hstmt,
    SQLUSMALLINT    iCol,
    SQLUSMALLINT    iField,
    _Out_writes_bytes_opt_(cbDescMax)
    SQLPOINTER      pCharAttr,
    SQLSMALLINT     cbDescMax,
    _Out_opt_
    SQLSMALLINT     *pcbCharAttr,
    _Out_opt_
    SQLLEN          *pNumAttr
);
#else
SQLRETURN SQL_API SQLColAttributeW(
    SQLHSTMT        hstmt,
    SQLUSMALLINT    iCol,
    SQLUSMALLINT    iField,
    _Out_writes_bytes_opt_(cbDescMax)
    SQLPOINTER      pCharAttr,
    SQLSMALLINT     cbDescMax,
    _Out_opt_
    SQLSMALLINT     *pcbCharAttr,
    _Out_opt_
    SQLPOINTER      pNumAttr);
#endif

そしてそれがいかに難しいかを理解する

  • >(私にとって)両方の場合(x64/x86)で関数名の衝突を避けるため
  • > (Microsoft の場合) 正しいドキュメントを作成するには
于 2013-11-19T16:42:15.657 に答える