我想用我的程序创建一个新的mdb文件,但失败,错误代码为6,对应于ODBC_ERROR_COMPONENT_NOT_FOUND
,并显示以下本地化消息:可编写的可解释性Dans le registre 可以翻译为:在注册表中找不到组件。
我不确定注册表中到底需要什么,但是计算机中是否存在以下注册表项及其数据:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\Microsoft 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\0";
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 。
答案 0 :(得分:0)
单独创建文件的代码很好。错误的是计算机的配置。 在注册表中,对于 32位程序,ODBC驱动程序定义位于 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ODBC \ ODBCINST.INI \ 。
但是 64位的用户会查看 HKEY_LOCAL_MACHINE \ SOFTWARE \ ODBC \ ODBCINST.INI \ 。在当前情况下,这些位置丢失了。
ODBC驱动程序是特定于平台的,因此它们可用于32位应用程序,但不适用于同一台计算机上的64位应用程序。
在我的情况下,安装了x64计算机,32位MS Office套件以及所有捆绑的32位ODBC驱动程序。上面的代码在64位模式下失败,但在32位模式下编译时成功创建了.mdb文件。 (相对路径顺便说一句)。
因此,此问题的最终解决方案是下载并安装用于x64平台(https://www.microsoft.com/en-us/download/details.aspx?id=54920)的ODBC驱动程序
“管理工具”面板中不需要配置,因为它用于指向现有数据库。
感谢seccpur将我指向正确的方向。