簡體   English   中英

無法使用 C++ 連接到 Access 數據庫

[英]Cannot connect to Access Database using C++

我的主題對我來說有點愚蠢和復雜。 我正在嘗試與 Access 2007 db 建立非常簡單的連接,但連接從未發生。 我想看看 SQLGetDiagRec() 會發生什么,但是當執行 SQLGetDiagRec() 時程序崩潰了。 我對 C++ 不是很了解,所以過去幾天我一直被困在這個問題上。 任何幫助將不勝感激。 我正在使用 Visual C++ 2008。

編輯:將字符集從 Unicode 更改為多字節后,我能夠執行 SQLGetDiagRec。 然后,我將我的兩個指針從 int 和 char 更改為 SQLSMALLINT 和 SQLCHAR,並且,砰,它起作用了。 非常感謝單挑家伙。

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>
#include <stdio.h>
#include <stdlib.h>


int main(){
    char szDSN[256] = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DSN='Hospital_mdb';DBQ=C:\\Hospital.mdb;";
    SQLHANDLE EnvHandlePtr;
    SQLHANDLE ConHandle;
    SQLHANDLE StmtHandle;
    SQLRETURN rc;

    SQLSMALLINT iConnStrLength2Ptr; // Changing from int     iConnStrLength2Ptr;
    SQLCHAR szConnStrOut[256]; //changing from char    szConnStrOut[256];
    SQLCHAR SQLState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
    SQLINTEGER NativeError;
    SQLSMALLINT MsgLen;


    if ( (rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvHandlePtr)) == SQL_SUCCESS){
        printf("Environment Set!");
        if( (rc = SQLSetEnvAttr(EnvHandlePtr, SQL_ATTR_ODBC_VERSION,
            (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER))==SQL_SUCCESS ){
                printf("Driver Set!");
                if ( (rc = SQLAllocHandle(SQL_HANDLE_DBC, EnvHandlePtr, &ConHandle))==SQL_SUCCESS ){
                    printf("Allocation Done!");//**so far, so good, but then the connection doesn't happen**
                    rc = SQLDriverConnect(ConHandle, NULL, (SQLWCHAR*)szDSN, 
                        SQL_NTS, (SQLWCHAR*) szConnStrOut, 0, (SQLSMALLINT*) iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
                    if ( rc == SQL_SUCCESS ){
                    //if ( (rc = SQLConnect(ConHandle, (SQLWCHAR*)szDSN, SQL_NTS, (SQLWCHAR*)"", SQL_NTS, (SQLWCHAR*)"", SQL_NTS))== SQL_SUCCESS ){
                        printf("Connection Done");
                    }//end of Connection clause
                    else{   
                        SQLGetDiagRec(SQL_HANDLE_DBC, ConHandle, 1, (SQLWCHAR*)SQLState, &NativeError, (SQLWCHAR*)Msg, sizeof(Msg), &MsgLen);
                            printf("Connection Failed\n%s", Msg);
                    }
                    SQLDisconnect(ConHandle);
                }//end of Connection Allocation clause
                SQLFreeHandle(SQL_HANDLE_DBC, ConHandle);
        }//end of Driver clause
        SQLFreeHandle(SQL_HANDLE_ENV, EnvHandlePtr);
    }//end of Enviroment clause

    _getch();

}//end of main

您正在投射編譯器為您的錯誤代碼生成的診斷信息。 至少 SQLState 是壞的,當寫入 12 個字節時,您傳遞了一個 6 字節的緩沖區。 這會破壞堆棧幀。 出於同樣的原因,SQLDriverConnect 調用無法工作。

通過正確聲明局部變量來刪除所有強制轉換。

並在您的代碼中使用 Unicode。 您可以在項目設置中禁用它,但是當您使用 dbase 時,這絕不是一個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM