用VC++实现ODBC数据源设置

 
为了使ODBC能与数据库一起工作,必须把数据库注册到ODBC驱动程序管理器,这项工作可以通过定义一个DSN或数据源名字来完成。通常,我们只能手动打开系统控制面板,运行其中的ODBC数据源管理器,手工配置数据源,但是这项工作对用户而言过于复杂,我们必须考虑用程序替用户完成这些配置工作。
  1. SQLConfigDataSource 函数说明
  ODBC API提供了动态创建数据源的函数SQLConfig DataSource。该函数的原型如下:
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。
  2 .两个需要注意的问题
  (1)当我们使用SQLConfigDataSource ODBC API函数时必须声明包含系统的odbcinst.h头文件,所以我们再选择workspace窗口中FileView打开Header Files中Imageprocess.h,在其中加入#include“odbcinst.h”。
  (2)SQLConfigDataSource 这个API函数时候必须用到odbccp32.dll,它是Microsoft 提供的32 位ODBC安装和管理的DLL,如果是16 位必须用到odbcinst.dll,odbccp32.dll 有一个import library,所以解决的办法就是把这个odbccp32.lib加到我们的项目中,我们可以打开
Project系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的/vc/lib/目录,文件类型选Library Files(.lib) , 选择其中odbccp32.lib后按OK键。
  3 .程序代码
  从上文看出设置参数lpszAttributes时需要设置数据库文件的路径,为了方便用户的使用,可以将数据库文件保存到该项目的debug文件夹下,通过程序实现自动获取数据库文件路径的功能,代码如下:
    CString szPath;
    GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
    szPath.ReleaseBuffer ();
    int nPos;
    nPos=szPath.ReverseFind (’//’);
    szPath=szPath.Left (nPos);
    CString szFile = sPath + "//image.mdb";
    char szAtr[256];
    sprintf(szAtr,"DSN=%s!DBQ=%s!DEFAULTDIR=%s!! ","MYIMAGE", szFile,szPath);
    int nlen;
    nlen = strlen(szAtr);
    for (int i=0; i<nlen; i++)
    {
         if (szAtr [i] == ’!’)
         szAtr [i] = ’/0’;
    }
   if (FALSE == SQLConfigDataSource(NULL, ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)/0", (LPCSTR)szAtr))
          AfxMessageBox("SQLConfigDataSource Failed");
  编译并运行程序后,可以通过控制面板的ODBC数据源管理器或注册表查看运行结果,就会看到数据库已经成功的注册了。
下面再介绍一个通用函数
/*
头文件:#include <odbcinst.h> //SQLConfigDataSource
函数:CrreateDSN
功能:动态创建数据源
输入参数:CString str 名称
CString strDatabase 数据库的路径
CString strDescription 说明
CString strServer 服务器名称
CString strUID 用户名
int iCount 标识数据库类型, 1表示Access数据库; 2表示SQL Server; 3表示Oracle数据库
返回值: int型
1: 表示创建Access数据源成功
-1: 表示创建Access数据源失败
2: 表示创建SQL Server数据源成功
-2: 表示创建SQL Server数据源失败
3: 表示创建Oracle数据源成功
-3: 表示创建Oracle数据源失败
-4: 表示不支持创建其他类型的数据源
*/
AFX_EXT_CLASS int CrreateDSN(CString str, CString strDatabase, CString strDescription, CString strServer, CString strUID, int iCount)
{
char* Attributes;
int mlen, i;
Attributes=new char[256];
switch(iCount)
{
case 1:
   sprintf(Attributes,"DSN=%s! DESCRIPTION=%s! DBQ=%s! FIL=MicrosoftAccess! DEFAULTDIR=D://Database!!",
    str, strDescription, strDatabase);
   mlen = strlen(Attributes);
   for (i=0; i<mlen; i++)
   {
    if (Attributes[i] == '!')
    Attributes[i] = '/0';
   }
   if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)/0",(LPCSTR)Attributes))
    return 1;
   else
    return -1;
   break;
case 2:
   sprintf(Attributes,"DSN=%s!Description=%s!server=%s!Database=%s!",
    str, strDescription, strServer, strDatabase);
   mlen = strlen(Attributes);
   for (i=0; i<mlen; i++)
   {
    if (Attributes[i] == '!')
     Attributes[i] = '/0';
   }
   if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"SQL Server/0",(LPCSTR)Attributes))
    return 2;
   else
    return -2;
   break;
case 3:
   sprintf(Attributes,"DSN=%s!Description=%s!ServerName=%s!UserID=%s!",
    str, strDescription, strServer, strUID);
   mlen = strlen(Attributes);
   for (i=0; i<mlen; i++)
   {
    if (Attributes[i] == '!')
     Attributes[i] = '/0';
   }
   if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Oracle in OraHome92/0",(LPCSTR)Attributes))
    return 3;
   else
    return -3;
   break;
default:
   return -4;
   break;
} }
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值