【问题标题】:Cannot connect to Access Database using C++无法使用 C++ 连接到 Access 数据库
【发布时间】:2011-08-03 20:49:51
【问题描述】:

我的主题对我来说有点愚蠢和复杂。我正在尝试与 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

【问题讨论】:

    标签: c++ ms-access-2007


    【解决方案1】:

    您正在转换编译器为您的错误代码生成的诊断信息。至少 SQLState 很糟糕,当写入 12 个字节时,您正在传递一个 6 字节的缓冲区。这会破坏堆栈帧。由于同样的原因,SQLDriverConnect 调用无法工作。

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

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

    【讨论】:

    • 基本上我让他们像那样铸造,因为配置不好。在将项目的字符集从 Unicode 更改为多字节(并正确声明变量)后,我得到了它的工作。但问题是我仍然无法连接到数据库,但我可以打印错误,即“无效的字符串或缓冲区长度”。我发现这意味着这里的某个地方存在实际问题rc = SQLConnect(ConHandle, szDSN, SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS)Thanx 的帮助,我也要去寻找这个。
    • 尽量不要忽略“从不犯错”的评论。使用 dbase 时,Unicode 是必不可少的
    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多