VC动态建立ODBC数据源

本文介绍如何在Visual C++(VC)环境中动态创建ODBC数据源,连接到SQL Server或Microsoft Access数据库。通过设置DSN,应用程序能够方便地进行数据库操作,处理NULL值,并确保SQL语句的正确执行。
动态创建数据源需要用到的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("添加数据源失败!");
   }
  }

}

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值