您的位置:首页 > 编程语言 > C语言/C++

Visual C++实现自动配置ODBC数据源

2007-09-19 16:41 579 查看
 
为了使ODBC能与数据库起工作,必须把数据库注册到ODBC驱动程序管理器,这项工作可以通过定义一个DSN或数据源名字来完成。通常,我们只能手动打开系统控制面板,运行其中的ODBC数据源管理器,手工配置数据源,这次做公司里的手机借用信息管理系统老大要求程序运行的时候自动完成数据源的配置,我做为一个才用VC写程序一周时间的菜鸟,只好边找资料便做,网上的资料百分之八十都是重复的,其实做完后觉得是一个很简单的事情,结果在上面浪费了4、5个小时。我把找的资料和一些需要注意的东西放到空间里来,或许下次和那些刚学VC的人有些帮助。
一、我写的最简单的代码段(加入到你要使用到数据库或者是程序启动初始化的文件函数里),没有写错误处理部分,是不完整的,但是可以用了,为了敢时间就注意将就着用一下把。在下个系统下个版本里修改一下。代码段如下:
if(!SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"Microsoft Access Driver (*.mdb)/0",
                                    "DSN=mobilephone/0"
                                                   "Description=mobilephone/0"
                                                   "DBQ=////smcrdsvr//样机登记//mobilephone.mdb/0"
                                                   "FIL=MS Access/0"
                                                   "DriverId=25/0"))       
     {   
       MessageBox("注册数据源DSN失败!");    
     }
1、  要注意" /0",只要是字符串的地方都需要加是,负责你只有使劲找错误,但是错误提示你还没办法找到错误出处,我就在这个上面花了很长时间。
2、  在填写数据库路径的时候要在每一个“/”前再加一个”/”,这样才能够让MFC认出这个是路径的信息。
3、  如果你用的是Access 2003(我就是用的这个做的程序),那么用来设置数据库路径的"DBQ=////smcrdsvr//样机登记//mobilephone.mdb/0"一定为能够把其中的DBQ改为” DataDirectory”、” DefaultDir”之类的,我开始按网上的资料做结果就因为没有用DBQ而是用的DefaultDir弄了好久都没有对。但是其他的数据库可能又不一样。我没有试过。
4、  DriverId的值不同的数据库有不同的值,同样的数据库有可能因为版本不一样也会不同。大家注意区分。

二、网上资料:
  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数据源管理器或注册表查看运行结果,就会看到数据库已经成功的注册了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息