カスタム ODBC ドライバーを作成しています。
私の主な方法:
int main(int argc, char** argv) {
SQLRETURN status;
//SQLHANDLE hEnv;
//SQLHANDLE hStmt;
SQLHENV hEnv;
SQLHDBC dbc = 0;
SQLHSTMT hStmt;
SQLCHAR ConnStrOut[1024];
SQLSMALLINT x;
// startup banner
//printf();
MessageBox(GetDesktopWindow(), "ODBC Client\n\n", "Driver", MB_OK);
// show query to be executed
printf("Query: %s\n", "SELECT VISITS FROM TRAFFIC");
// allocate ENVIRONMENT
status = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
// check for error
ODBC_CHK_ERROR(SQL_HANDLE_ENV, hEnv, status, "");
// set the ODBC version for behaviour expected
status = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);
CHECK_STATUS(status, (UCHAR*)"SQLSetEnvAttr", hEnv, SQL_HANDLE_ENV);
// check for error
ODBC_CHK_ERROR(SQL_HANDLE_ENV, hEnv, status, "");
// allocate CONNECTION
status = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &dbc);
// check for error
ODBC_CHK_ERROR(SQL_HANDLE_ENV, hEnv, status, "");
// ----------- real connection takes place at this point
status = SQLDriverConnect(dbc, GetDesktopWindow(),
(unsigned char*) "DSN=myDSN",
SQL_NTS, ConnStrOut, 1024, &x,
SQL_DRIVER_PROMPT);
if (SQL_SUCCEEDED(status)) {
printf("Connected\n");
printf("Returned connection string was:\n\t%s\n", ConnStrOut);
//SQLDisconnect(dbc);
}
サンプル クライアントを使用して main を実行すると、すべてがうまく機能します。
ただし、odbc テスト ツール odbcte32 や、SqlDbx や QTODBC などの他の odbc クライアントを試すと、'myDSN' (カスタム ドライバーを使用) を使用して接続を確立しようとすると、常に[Microsoft][ODBC ドライバーManager] ドライバはこの機能をサポートしていません
コンパイルしたドライバー DLL を使用するユーザー DSN からキーと値のペアを読み取って、OutConnectionString を作成する SQLDriverConnect 関数を適切に実装しました。
すべての odbc 関数のスケルトンを定義しましたhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms714562(v=vs.85).aspx
minGW コンパイラ (32 ビット) を使用してカスタム ダイバーをコンパイルします。Windows 7 OS 64 ビットを使用していますが、32 ビットの ODBC テスト ツールを実行しています。
これは私を夢中にさせています。使用しているドライバーでサポートされていない特定の機能がわかりません。ここでも、必要なすべての機能のスケルトンを作成しました。リストは次のとおりです。
SQLAllocConnect , SQLAllocEnv , SQLAllocStmt , SQLAllocHandle , SQLFreeConnect , SQLFreeEnv , SQLFreeStmt , SQLBindCol , SQLCancel , SQLConnect , SQLDescribeCol , SQLDisconnect , SQLExecDirect , SQLExecute , SQLExtendedFetch , SQLFetch , SQLGetCursorName , SQLNumResultCols , SQLPrepare , SQLRowCount , SQLSetCursorName , SQLColumns , SQLDriverConnect , SQLGetData , SQLGetInfo , SQLGetTypeInfo 、 SQLParamData 、 SQLPutData 、 SQLStatistics 、 SQLTables 、 SQLBrowseConnect 、 SQLColumnPrivileg、 SQLDescribeParam 、 SQLForeignKeys 、 SQLMoreResults 、 SQLNativeSql 、 SQLNumParams 、SQLPrimaryKeys , SQLProcedureColum, SQLProcedures , SQLSetPos , SQLTablePrivilege, SQLBindParameter , SQLCloseCursor , SQLColAttribute , SQLCopyDesc , SQLEndTran , SQLFetchScroll , SQLFreeHandle , SQLGetConnectAttr, SQLGetDescField , SQLGetDescRec , SQLGetDiagField , SQLGetDiagRec , SQLGetEnvAttr , SQLGetStmtAttr , SQLSetConnectAttr, SQLSetDescField , SQLSetDescRec , SQLSetEnvAttr , SQLSetStmtAttr , SQLBulkOperations, SQLSpecialColumns。SQLFreeHandle 、 SQLGetConnectAttr 、 SQLGetDescField 、 SQLGetDescRec 、 SQLGetDiagField 、 SQLGetDiagRec 、 SQLGetEnvAttr 、 SQLGetStmtAttr 、 SQLSetConnectAttr 、 SQLSetDescField 、 SQLSetDescRec 、 SQLSetEnvAttr 、 SQLSetStmtAttr 、 SQLBulkOperations 、 SQLSpecialColumns.SQLFreeHandle 、 SQLGetConnectAttr 、 SQLGetDescField 、 SQLGetDescRec 、 SQLGetDiagField 、 SQLGetDiagRec 、 SQLGetEnvAttr 、 SQLGetStmtAttr 、 SQLSetConnectAttr 、 SQLSetDescField 、 SQLSetDescRec 、 SQLSetEnvAttr 、 SQLSetStmtAttr 、 SQLBulkOperations 、 SQLSpecialColumns.
編集:
理解した。SQLDisconnect が正しく定義されていません。渡されたすべてのパラメーターが正しいことを確認してください。正しい定義は次のとおりです。
RETCODE SQL_API SQLDisconnect(SQLHDBC pHandle) {
__CHK_HANDLE(pHandle, SQL_HANDLE_DBC, SQL_ERROR);
_SQLFreeDiag(_DIAGCONN(pHandle));
_SQLDisconnect((PGENODBCCONN) pHandle);
return (SQL_SUCCESS);
}
私がそれを理解した方法:.defファイルを作成し(ドライバーDLLファイル名と同じ名前を付けます。つまり、私の場合はaxodbc.defでした)、ドライバーに存在するすべての関数を次のようにリストします。
LIBRARY axodbc
DESCRIPTION "Driver 1 definitions"
EXPORTS
SQLAllocConnect
SQLAllocEnv
SQLAllocStmt
SQLAllocHandle
SQLFreeConnect
SQLFreeEnv
SQLFreeStmt
SQLBindCol
SQLCancel
SQLConnect
SQLDescribeCol
SQLExecDirect
SQLExecute
SQLDisconnect
SQLExtendedFetch
SQLFetch
SQLGetCursorName
SQLNumResultCols
SQLPrepare
SQLRowCount
SQLSetCursorName
SQLColumns
SQLDriverConnect
SQLGetData
SQLGetInfo
SQLGetTypeInfo
SQLParamData
SQLPutData
SQLStatistics
SQLTables
SQLBrowseConnect
SQLColumnPrivileges
SQLDescribeParam
SQLForeignKeys
SQLMoreResults
SQLNativeSql
SQLNumParams
SQLPrimaryKeys
SQLProcedureColumns
SQLProcedures
SQLSetPos
SQLTablePrivileges
SQLBindParameter
SQLCloseCursor
SQLColAttribute
SQLCopyDesc
SQLEndTran
SQLFetchScroll
SQLFreeHandle
SQLGetConnectAttr
SQLGetDescField
SQLGetDescRec
SQLGetDiagField
SQLGetDiagRec
SQLGetEnvAttr
SQLGetStmtAttr
SQLSetConnectAttr
SQLSetDescField
SQLSetDescRec
SQLSetEnvAttr
SQLSetStmtAttr
SQLBulkOperations
SQLSpecialColumns
(mingw (g++) を使用して) DLL をコンパイルし、次のような .def ファイルをインクルードします。
g++ -shared -o axodbc.dll axodbc.cpp connectionmanager.cpp diagnostics.cpp myresources.res axodbc.def -lodbc32 -lodbccp32
この時点で、SQLDisconnect が正しく定義されていないというエラーがコンパイラから返されました