无法使用C ++连接到Access数据库

| 我的主题对我来说有些愚蠢和复杂。我正在尝试与Access 2007 db建立非常简单的连接,但是连接从未发生。我正在尝试查看SQLGetDiagRec()会发生什么,但是执行SQLGetDiagRec()时程序崩溃。我对C ++的了解不多,因此在过去的几天中,我一直陷于此。任何帮助将不胜感激。我正在使用Visual C ++ 2008。 编辑:将字符集从Unicode更改为多字节后,我能够执行SQLGetDiagRec。然后,我将我的两个指针从int和char更改为SQLSMALLINT和SQLCHAR,并且,bam成功了。非常感谢那些单挑的家伙。
#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时绝不是一个错误。     

要回复问题请先登录注册