网络上没有这个函数能实际落地的用法说明,我实践后整理一下:
1.头文件与额外依赖库:
cpp
#include <odbcinst.h>
#pragma comment(lib, "legacy_stdio_definitions.lib")
2.调用函数:
cpp
if (!SQLConfigDataSourceW(NULL, ODBC_ADD_DSN, L"驱动", "以\0为间隔的参数字符串\0\0"))
{
DWORD err = GetLastError();
AfxMessageBox(_T("Can't add DSN!"));
return;
}
这里最不容易确定的是"驱动"和"参数字符串"这两个参数,经过实践,我找到一种十分简单的方法:
3.运行"C:\Windows\System32\odbcad32.exe"(64位),"C:\Windows\SysWOW64\odbcad32.exe"(32位),切换到"文件DSN"页签
- 点击"添加(D)..."按钮,在弹出的对话框中选择驱动,下一步:
- 指定DSN文件保存到的位置,点击"下一步",点击"完成"
6.在弹出的窗口中选择关联的数据库文件,这里选择一个access数据库,点击两个窗口的"确定"按钮即可完成文件DSN的创建。
- 找到刚才保存到的DSN文件,使用记事本打开,其中这里的文本就是SQLConfigDataSource的参数字符串:
8.接下来就是把这个文本转为SQLConfigDataSource的参数:
a.把文本中的"\"转为"\\"
b.添加一项配置指定DSN名字:DSN=MyDSN
c.在每个配置后面加一个"\0"
d.在字符串的最后再多加一个"\0"表示结束
最后得到代码:
cpp
if (!SQLConfigDataSourceW(NULL, ODBC_ADD_DSN, L"Microsoft Access Driver (*.mdb, *.accdb)",
L"DSN=MyDSN\0"
L"DRIVER=Microsoft Access Driver (*.mdb, *.accdb)\0"
L"UID=\0"
L"UserCommitSync=Yes\0"
L"Threads=3\0"
L"SafeTransactions=0\0"
L"PageTimeout=5\0"
L"MaxScanRows=8\0"
L"MaxBufferSize=2048\0"
L"FIL=MS Access\0"
L"DriverId=25\0"
L"DefaultDir=E:\\\0"
L"DBQ=E:\\Database1.mdb\0"
"\0"))
{
DWORD err = GetLastError();
AfxMessageBox(_T("Can't add DSN!"));
return;
}
☆注意事项:
A.64位和32位的程序新建的DSN都是要分开的
B.参数字符串最后要加多一个"\0"