ODBC的工作依赖于数据库制造商提供的驱动程序,使用ODBC API的时候,Windows的ODBC管理程序,
把数据库访问的请求传递给正确的驱动程序,驱动程序再使用SQL语句指示DBMS完成数据库访问工作,
因此,ODBC的存在为我们开发应用数据库程序提供了非常强大的能力和灵活性。
为了使ODBC能与数据库一起工作,必须把数据库注册到ODBC驱动程序管理器,这项工作可以通过定义一个DSN或数据源名字来完成。
通常,我们只能手动打开系统控制面板,运行其中的ODBC数据源管理器,手工配置数据源,但是这项工作对用户而言过于复杂,
我们必须考虑用程序替用户完成这些配置工作。
因此许多程序员在发布自己编写的数据库软件时候都希望能有一个优秀的安装程序能够自动设置好ODBC数据源,
虽然现在 InstallShield等一些优秀的安装制作软件可以帮助我们实现此类功能,但毕竟缺少灵活,
程序员不能完全控制它,事实上,我们完全可以自己编写一些程序实现此类功能,
实现的方法有几种,
一种办法是用程序修改Windows注册表,程序员可以用Windows API函数增改HKEY_LOCAL_MACHINESoftwareODBC下的ODBC.INI中的键值,
这种方法比较烦琐。
我现在推荐一种在程序中使用ODBC API的方法,程序员可以在任何时候都可以用Visual C++编写的程序调用这些API函数来设置ODBC数据源。
下面我用MFC写一个程序来演示如何实现这个功能:
首先,打开Visual C++,在File菜单上选New,然后选定MFC AppWizard(exe)类的项目,Project name我们定为try,按下OK键,
下一Step 1屏幕中选Dialog based,由于不必用到后面的选项,此时即可按下Finish键,结果系统将生成一个新的项目。
完成上述工作后,在左侧Workspace窗口中,选择 ResourceView,打开try resources中的Dialog资源,
选择并打开IDD_TRY_DIALOG对话窗口,在Controls菜单窗口中点选按键图标,回到 IDD_TRY_DIALOG对话窗口并点击此窗口,
将生成一个名叫Button1的按键,选中此按键再按鼠标右键,在弹出式菜单上选 Properties选项,
在出现的对话框中把Caption项的Button1值改为Setup ODBC,关闭此对话框,再选中此按键按鼠标右键,
选择ClassWizard,在出现的对话窗口中,Object Ids选IDC_BUTTON1,Messages中双击BN_CLICKED,
此时弹出Add Member Function对话窗,Member function name是OnButton1,按OK键。
在Member functions选项中双击onButton1 ON_IDC_BUTTION1:BN_CLICKED,
在出现的void CTryDlg::OnButton1()函数中用以下ODBC API函数语句替换
//TODO: Add your control notification handler
code here这条注释语句:
SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"Microsoft Access Driver (*.mdb)\\0
:配置或者修改一个存在的系统数据源;
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函数时候必须用到odb32.dll,它是Microsoft 提供的32 位ODBC安装和管理的DLL,
如果是16 位必须用到odbcinst.dll,odb32.dll 有一个import library,所以解决的办法就是把这个odb32.lib加到我们的项目中,
我们可以打开 Project系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的\\vc\\lib\\目录,文件类型选Library Files(.lib) ,
选择其中odb32.lib后按OK键。 以上代码均在WINxp,VC6.0上编译通过,您可以灵活应用这些办法,让您编写的软件更易于安装维护和使用。
用VC++实现ODBC数据源设置
CND8学院 VC教程 发布日期:2008年12月11日
--------------------------------------------------------------------------------
为了使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)”;对SQL SERVER数据源,则应赋以字符串“SQL Server”。
(4)参数lpszAttributes用于指定ODBC数据源属性。例如:
① 对Access数据源:
"DSN= MYIMAGE DBQ=D:ImageProcessimage.mdb
DEFAULTDIR= D:ImageProcess"
说明:该字符串指定数据源名称(DNS)为MYIMAGE;数据库文件(DBQ)为D:ImageProcessimage.mdb ;缺省数据库文件路径(DEFAULTDIR) 为D:ImageProcess 。
② 对SQL SERVER数据源:
"DSN=MYIMAGE SERVER=MYET 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函数时候必须用到odb32.dll,它是Microsoft 提供的32 位ODBC安装和管理的DLL,如果是16 位必须用到odbcinst.dll,odb32.dll 有一个import library,所以解决的办法就是把这个odb32.lib加到我们的项目中,我们可以打开
Project系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的vclib目录,文件类型选Library Files(.lib) , 选择其中odb32.lib后按OK键。
3 .程序代码
从上文看出设置参数lpszAttributes时需要设置数据库文件的路径,为了方便用户的使用,可以将数据库文件保存到该项目的debug文件夹下,通过程序实现自动获取数据库文件路径的功能,代码如下:
CString szPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
szPath.ReleaseBuffer ();
int nPos;
nPos=szPath.ReverseFind (’’);
szP
ath=szPath.Left (nPos);
CString szFile = sPath + "image.mdb";
char szAtr[256];
sprintf(szAtr,"DSN=%s!DBQ=%s!DEFAULTDIR=%s!!
break;
default:
return -4;
break;
}
}
用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函数时候必须用到odb32.dll,它是Microsoft 提供的32 位ODBC安装和管理的DLL,如果是16 位必须用到odbcinst.dll,odb32.dll 有一个import library,所以解决的办法就是把这个odb32.lib加到我们的项目中,我们可以打开
Project系统菜单
项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的\\vc\\lib\\目录,文件类型选Library Files(.lib) , 选择其中odb32.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!!
Attributes[i] = '\\0';
}
if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"SQL Server\\0下载本文