gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:50:36 24 4
gpt4 key购买 nike

我的主题对我来说有些愚蠢和复杂。我正在尝试与 Access 2007 数据库建立非常简单的连接,但连接从未发生。我试图查看 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。您可以在您的项目设置中禁用它,但是当您使用数据库时,这绝不会是一个错误。

关于c++ - 无法使用 C++ 连接到 Access 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5635330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com