如何使用ODBC创建mdb文件
How to create a mdb file with ODBC?
我想用我的程序创建一个新的mdb文件,但失败了,错误代码为6,对应于ODBC_ERROR_COMPONENT_NOT_FOUND
,并显示以下本地化消息:Composant intruvable dans le registre,可以翻译为:注册表中找不到组件。
我不确定注册表中到底需要什么,但以下密钥及其数据存在于我的计算机中:
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeODBCODBCINST.INIMicrosoft Access Driver (*.mdb)
那么我做错了什么?
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <odbcinst.h>
int main()
{
_setmode(_fileno(stdout), _O_U16TEXT);
LPCWSTR sDriver = L"Microsoft Access Driver (*.mdb)";
LPCWSTR wcAttrs = L"CREATE_DB=.\Test.mdb General ";
std::wcout << L"Check: " << wcAttrs << std::endl;
SQLConfigDataSource(NULL, ODBC_ADD_DSN, sDriver, wcAttrs);
SQLRETURN sReturn;
DWORD pfErrorCode;
wchar_t lpszErrorMsg[256];
sReturn = SQLInstallerError(1, &pfErrorCode, lpszErrorMsg, SQL_MAX_MESSAGE_LENGTH, 0);
std::wcout << L"pfErrorCode: " << pfErrorCode << std::endl;
std::wcout << L"Error message: " << lpszErrorMsg << std::endl;
std::cin.get();
return 0;
}
如果要编译此代码,请不要忘记使用odbccp32.lib和legacy_stdio_definitions.lib
单独创建文件的代码很好。问题出在电脑的配置上。在注册表中,ODBC驱动程序定义位于HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST。INI\用于32位程序。
但是64位可以查看HKEY_LOCAL_MACHINE\SOFTWARE\ODBCINST。INI\在本例中,其中缺少。
ODBC驱动程序是特定于平台的,因此它们可以用于32位应用程序,但不能用于同一台机器上的64位应用程序。
在我的案例中,是一台x64计算机,安装了一个32位的MS Office套件,以及所有捆绑的32位ODBC驱动程序。上面的代码在64位模式下失败,但在32位模式下编译时成功创建了.mdb文件。(相对路径工作良好BTW(。
因此,这个问题的最终解决方案是下载并安装x64平台的ODBC驱动程序(https://www.microsoft.com/en-us/download/details.aspx?id=54920)
管理工具面板中不需要任何配置,因为它用于指向已存在的数据库。
感谢seccpur为我指明了正确的方向。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 如何使用ODBC创建mdb文件
- 直接访问较旧的MDB文件
- 什么是在 x64 中为访问 mdb 文件创建 OdbcConnection 的连接字符串
- 如何为mdb文件提供版本