动态创建数据源需要用到的API:SQLConfigDataSource,需要包含的头文件为:#include <odbcinst.h>,需要包含静态库:#pragma comment(lib, "ODBCCP32.lib")。
SQLConfigDataSource 函数说明
ODBC API提供了动态创建数据源的函数SQLConfigDataSource。该函数的原型如下:
BOOL SQLConfigDataSource ( HWND hwndParent,WORD fRequest, LPCSTR lpszDriver,LPCSTR lpszAttributes );
参数说明如下:
(1)参数hwndParent用于指定父窗口句柄,在不需要创建数据源对话框时,可以将该参数指定为NULL。
(2)参数fRequest用于指定函数的操作内容,取值如下:
ODBC_ADD_DSN: 加入一个新的用户数据源;
ODBC_CONFIG_DSN:修改一个存在的用户数据源;
ODBC_REMOVE_DSN:除一个存在的用户数据源;
ODBC_ADD_SYS_DSN:增加一个新的系统数据源;
ODBC_CONFIG_SYS_DSN:配置或者修改一个存在的系统数据源;
ODBC_REMOVE_SYS_DSN:删除一个存在的系统数据源;
ODBC_REMOVE_DEFAULT_DSN:删除省缺的数据源说明部分。
(3)参数lpszDriver用于指定ODBC数据源的驱动
程序类别,例如,为了指定Access数据源,该参数应赋以字符串“Microsoft Access Driver (*.mdb)\0”;对SQL SERVER数据源,则应赋以字符串“SQL Server”。
(4)参数lpszAttributes用于指定ODBC数据源属性。例如:
① 对Access数据源:
"DSN= MYIMAGE\0 DBQ=D:\\ImageProcess\\image.mdb\0
DEFAULTDIR= D:\\ImageProcess\0\0"
说明:该字符串指定数据源名称(DNS)为MYIMAGE;数据库文件(DBQ)为D:\\ImageProcess\\image.mdb ;缺省数据库文件路径(DEFAULTDIR) 为D:\\ImageProcess 。
② 对SQL SERVER数据源:
"DSN=MYIMAGE\0 SERVER=MYET\0 DATABASE=Image"
说明:该字符串指定数据源名称(DSN)为MYIMAGE;SQLSERVER 数据库服务器名(SERVER)为 MYET;数据库名称(DATABASE)为Image。
以下为使用例程:
//函数功能:检测Access ODBC数据源是否存在。
//参数一: 数据源名称。
//参数二: 数据库文件名(包括完整路径)。
//函数返回:存在返回真,失败返回假。
BOOL ExistAccessDSN(LPCTSTR szDSN, LPCTSTR szDBName)
{
HKEY hkey = {0};
BYTE szBuffer[MAXBYTE] = {0};
DWORD nSize = sizeof(szBuffer);
char szReg[MAXBYTE] = {0};
strcpy(szReg, "Software\\ODBC\\ODBC.INI\\");
strcat(szReg, szDSN);
//检测用户ODBC数据源是否存在。
LONG Ret = RegOpenKey(HKEY_CURRENT_USER, szReg, &hkey);
if(Ret == ERROR_SUCCESS)
{
Ret = RegQueryValueEx(hkey, "DBQ", NULL, NULL, szBuffer, &nSize);
if(Ret == ERROR_SUCCESS)
{
if(strcmp((LPCTSTR)szBuffer, szDBName) == 0)
{
RegCloseKey(hkey);
return TRUE;
}
}
}
if(hkey != NULL)
{
RegCloseKey(hkey);
ZeroMemory(hkey, sizeof(hkey));
}
//检测系统ODBC数据源是否存在。
strcpy(szReg, "SOFTWARE\\ODBC\\ODBC.INI\\");
strcat(szReg, szDSN);
Ret = RegOpenKey(HKEY_LOCAL_MACHINE, szReg, &hkey);
if(Ret == ERROR_SUCCESS)
{
ZeroMemory(szBuffer, MAXBYTE);
Ret = RegQueryValueEx(hkey, "DBQ", NULL, NULL, szBuffer, &nSize);
if(Ret == ERROR_SUCCESS)
{
if(strcmp((LPCTSTR)szBuffer, szDBName) == 0)
{
RegCloseKey(hkey);
return TRUE;
}
}
}
if(hkey != NULL)
{
RegCloseKey(hkey);
ZeroMemory(hkey, sizeof(hkey));
}
return FALSE;
}
//以下为创建数据源部分
void CreateDataSource()
{
if(ExistAccessDSN("Zhych22", "D:\\Zhych22.mdb") == FALSE)
{
if(SQLConfigDataSource(NULL, ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)\0",
"DSN=Zhych22\0 PWD=123456\0 DBQ=D:\\Zhych22.mdb\0 DEFAULTDIR=D:\\\0")==1)
{
AfxMessageBox("添加数据源成功!");
}
else
{
AfxMessageBox("添加数据源失败!");
}
}
}
VC动态建立ODBC数据源
最新推荐文章于 2026-05-08 12:36:23 发布
本文介绍如何在Visual C++(VC)环境中动态创建ODBC数据源,连接到SQL Server或Microsoft Access数据库。通过设置DSN,应用程序能够方便地进行数据库操作,处理NULL值,并确保SQL语句的正确执行。

967





