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

C++ 无法使用C+;连接到Access数据库+;,c++,ms-access-2007,C++,Ms Access 2007,我的主题对我来说有点愚蠢和复杂。我试图与Access 2007 db建立一个非常简单的连接,但这种连接从未发生过。我试图看看SQLGetDiagRec()会发生什么,但是当执行SQLGetDiagRec()时,程序会崩溃。我对C++没有那么多,所以我在这几天陷入困境。我们将非常感谢您的帮助。我使用Visual C++ 2008。< /P> 编辑:将字符集从Unicode更改为多字节后,我能够执行SQLGetDiagRec。一、 然后,将我的两个指针从int和char更改为SQLSMALLINT和

我的主题对我来说有点愚蠢和复杂。我试图与Access 2007 db建立一个非常简单的连接,但这种连接从未发生过。我试图看看SQLGetDiagRec()会发生什么,但是当执行SQLGetDiagRec()时,程序会崩溃。我对C++没有那么多,所以我在这几天陷入困境。我们将非常感谢您的帮助。我使用Visual C++ 2008。< /P> 编辑:将字符集从Unicode更改为多字节后,我能够执行SQLGetDiagRec。一、 然后,将我的两个指针从int和char更改为SQLSMALLINT和SQLCHAR,然后,bam,它成功了。Thanx对那些头脑清醒的人来说太多了

#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
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
char szDSN[256]=“DRIVER={Microsoft Access DRIVER(*.mdb,*.accdb)};DSN='Hospital_mdb';DBQ=C:\\Hospital.mdb;”;
sqlhandleenhandleptr;
SQLHANDLE-ConHandle;
SQLHANDLE StmtHandle;
sqlreturnrc;
SQLSMALLINT-iconstrlengt2ptr;//从int-iconstrlengt2ptr更改为;
SQLCHAR szConnStrOut[256];//从char szConnStrOut[256]更改;
SQLCHAR SQLState[6],Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER-NativeError;
SQLSMALLINT-MsgLen;
if((rc=SQLAllocHandle(SQL\u HANDLE\u ENV、SQL\u NULL\u HANDLE和EnvHandlePtr))==SQL\u SUCCESS){
printf(“环境集!”);
如果((rc=SQLSetEnvAttr(envandleptr,SQL\u ATTR\u ODBC\u版本,
(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_UINTEGER))==SQL_SUCCESS){
printf(“驱动程序集!”);
if((rc=SQLAllocHandle(SQL\u HANDLE\u DBC、EnvHandlePtr和ConHandle))==SQL\u SUCCESS){
printf(“分配完成!”);//**到目前为止,一切正常,但是连接没有发生**
rc=SQLDriverConnect(ConHandle,NULL,(SQLWCHAR*)szDSN,
SQLNTS,(SQLWCHAR*)szConnStrOut,0,(SQLSMALLINT*)IConnstrllengt2PTR,SQL驱动程序\u NOPROMPT);
如果(rc==SQL\u成功){
//如果((rc=SQLConnect(ConHandle,(SQLWCHAR*)szDSN,SQL_NTS,(SQLWCHAR*)“”,SQL_NTS,(SQLWCHAR*)“”,SQL_NTS))==SQL_成功){
printf(“连接完成”);
}//连接终止条款
否则{
SQLGetDiagRec(SQL_HANDLE_DBC,ConHandle,1,(SQLWCHAR*)SQLState和NativeError,(SQLWCHAR*)Msg,sizeof(Msg)和MsgLen);
printf(“连接失败\n%s”,消息);
}
SQLDisconnect(ConHandle);
}//连接结束分配子句
sqlfreehold(SQL\u HANDLE\u DBC,ConHandle);
}//驱动程序结束条款
SQLFreeHandle(SQL\u HANDLE\u ENV,EnvHandlePtr);
}//环境终止条款
_getch();
}//干管末端

您正在强制转换编译器为错误代码生成的诊断。至少SQLState是错误的,在写入12个字节时,您正在传递一个6字节的缓冲区。这会损坏堆栈帧。出于相同的原因,SQLDriverConnect调用无法工作

通过正确声明局部变量删除所有强制转换


并在代码中使用Unicode。您可以在项目设置中禁用它,但在使用dbase时这绝不是一个错误。

基本上,由于配置不好,我将它们转换为Unicode。在将项目的字符集从Unicode更改为多字节(并正确声明变量)之后我让它工作了。但问题是我仍然无法连接到数据库,但我可以打印错误,这是一个“无效的字符串或缓冲区长度”。我发现这意味着这里的某个地方存在实际问题Thanx要获得帮助,我也要去找这个。请不要忽略“永不出错”的注释。使用数据库时,Unicode是必不可少的。