创建ODBC数据源SQLConfigDataSource函数的用法

网络上没有这个函数能实际落地的用法说明,我实践后整理一下:

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"页签

  1. 点击"添加(D)..."按钮,在弹出的对话框中选择驱动,下一步:
  1. 指定DSN文件保存到的位置,点击"下一步",点击"完成"

6.在弹出的窗口中选择关联的数据库文件,这里选择一个access数据库,点击两个窗口的"确定"按钮即可完成文件DSN的创建。

  1. 找到刚才保存到的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"

相关推荐
怎么追摩羯座4 天前
在银河麒麟系统中Qt连接达梦数据库
qt·达梦数据库·odbc
简简单单做算法4 个月前
基于鲸鱼优化的DSN弱栅栏覆盖算法matlab仿真
开发语言·matlab·鲸鱼优化·dsn·弱栅栏覆盖
金刚管管6 个月前
【DM8】ODBC
odbc·dameng
VAllen1 年前
在Linux平台下使用.NET Core访问Access数据库读取mdb文件数据
ado.net·odbc·access·oledb
高级梦想家1 年前
执行SQL语句&存储过程的真正【神器】,不用ORM的全选它,比dapper好
数据库·sql·mysql·postgresql·oracle·sqlserver·sqlite·c#·.net·事务·database·存储过程·orm·分页·odbc·crud·firebird
shif_l1 年前
ClickHouse集群搭建及ODBC配置
运维·clickhouse·zookeeper·odbc
liaosnet1 年前
QT通过ODBC连接GBase 8s数据库(Windows)示例
数据库·windows·qt·gbase·odbc