2011-04-12 70 views
0

我的主題對我來說有點愚蠢和複雜。我試圖與Access 2007數據庫進行非常簡單的連接,但連接永遠不會發生。我試圖看看SQLGetDiagRec()會發生什麼,但是執行SQLGetDiagRec()時程序崩潰。我對C++並沒有太多的瞭解,所以在過去的幾天裏我被困在這裏。任何幫助將不勝感激。我正在使用Visual C++ 2008.無法使用C++連接到Access數據庫

編輯:將字符集從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 

回答

2

您正在將編譯器爲錯誤代碼生成的診斷信息進行轉換。至少SQLState是壞的,當你寫12個字節時,你傳遞了一個6字節的緩衝區。這會破壞堆棧幀。 SQLDriverConnect調用不能用於相同的原因。

刪除全部通過正確聲明局部變量進行強制轉換。

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

+1

Lol'(SQLWCHAR *)szDSN' – 2011-04-12 12:58:52

+0

基本上我因爲配置錯誤而讓他們像這樣流氓。在將項目的字符集從Unicode更改爲Multibyte(並正確聲明變量)之後,我開始工作了。但問題是我仍然無法連接到數據庫,但我可以打印錯誤,這是一個「無效的字符串或緩衝區長度」。我發現這意味着這裏的某個地方存在着實際問題:'rc = SQLConnect(ConHandle,szDSN,SQL_NTS,(SQLCHAR *)「」,SQL_NTS,(SQLCHAR *)「」,SQL_NTS)也找到這一個。 – Iraklis 2011-04-12 16:50:59

+0

儘量不要忽視「從來不是錯誤」的評論。當您使用dbases時,Unicode是*必需*。 – 2011-04-12 22:01:08