用VC 实现ODBC数据源设置
ODBC(Open Database Conectivity)即开放式数据库互联,作为Windows开放性结构的一个重要部分已经为很多的Windows程序员所熟悉,
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\
DEFAULTDIR=E:\\\\database\\0\\0\");
DBQ=E:\\\\database\\\\plc.mdb\\0
您可以根据您不同的设置需要修改上面的语句,SQLConfigDataSource一般有以下几个许可的参数:
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: 删除省缺的数据源说明部分。
需要注意的是,当我们使用SQLConfigDataSource ODBC API函数时必须声明包含系统的odbcinst.h头文件,
所以我们再选择workspace窗口中FileView打开Header Files中try.h,在其中加入#include \"odbcinst.h\",
如果不加入这个头文件,系统编译时就会显示undeclared identifier错误,在完成上述步骤后,
假如我们立即编译并Link这个项目,会发现出现下面的错误:
tryDlg.obj : error LNK2001: unresolved external symbol
_SQLConfigDataSource@16 Debug/try.exe : fatal error LNK1120: 1 unresolved externals
有些人可能因为找不出错误而放弃了,其实这是因为当我们使用
SQLConfigDataSource 这个API函数时候必须用到odbccp32.dll,
它是Microsoft提供的32位ODBC安装和管理的DLL,如果是16位必须用到 odbcinst.dll,odbccp32.dll有一个import library,
所以解决的办法就是把这个odbccp32.lib加到我们的项目中,我们可以打开Project系统菜单项,选Add to Project子菜单,
在其中选Files项,打开VC安装目录下的vclib目录,文件类型选Library Files(.lib),选择其中Odbccp32.lib后按OK键,
然后重新编译即可通过,运行这个程序,将弹出对话窗,按下Setup ODBC按键,之后,您就可以通过控制面板的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键。 以上代码均在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函数时候必须用到odbccp32.dll,它是Microsoft 提供的32 位ODBC安装和管理的DLL,如果是16 位必须用到odbcinst.dll,odbccp32.dll 有一个import library,所以解决的办法就是把这个odbccp32.lib加到我们的项目中,我们可以打开
Project系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的vclib目录,文件类型选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!! szFile,szPath);
\
int nlen;
nlen = strlen(szAtr);
for (int i=0; i if (szAtr [i] == ’!’) szAtr [i] = ’’; } if (FALSE == SQLConfigDataSource(NULL, ODBC_ADD_DSN, \"Microsoft Access Driver (*.mdb)\ AfxMessageBox(\"SQLConfigDataSource Failed\"); 编译并运行程序后,可以通过控制面板的ODBC数据源管理器或注册表查看运行结果,就会看到数据库已经成功的注册了。 下面再介绍一个通用函数 /* 头文件:#include 函数: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! str, strDescription, strDatabase); mlen = strlen(Attributes); for (i=0; i if (Attributes[i] == '!') DBQ=%s! FIL=MicrosoftAccess! DEFAULTDIR=D:\\Database!!\ Attributes[i] = ''; } if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,\"Microsoft Access Driver (*.mdb)\ 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 if (Attributes[i] == '!') Attributes[i] = ''; } if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,\"SQL Server\ 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 if (Attributes[i] == '!') Attributes[i] = ''; } if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,\"Oracle OraHome92\ return 3; else return -3; break; default: return -4; break; } in } 用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!! szFile,szPath); \ int nlen; nlen = strlen(szAtr); for (int i=0; i if (szAtr [i] == ’!’) szAtr [i] = ’\\0’; } if (FALSE == SQLConfigDataSource(NULL, ODBC_ADD_DSN, \"Microsoft Access Driver (*.mdb)\\0\ AfxMessageBox(\"SQLConfigDataSource Failed\"); 编译并运行程序后,可以通过控制面板的ODBC数据源管理器或注册表查看运行结果,就会看到数据库已经成功的注册了。 下面再介绍一个通用函数 /* 头文件:#include 函数: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 if (Attributes[i] == '!') Attributes[i] = '\\0'; } if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,\"Microsoft Access Driver (*.mdb)\\0\ 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 if (Attributes[i] == '!') Attributes[i] = '\\0'; } if (FALSE == Server\\0\return 2; else return -2; SQLConfigDataSource(NULL,ODBC_ADD_DSN,\"SQL break; case 3: sprintf(Attributes,\"DSN=%s!Description=%s!ServerName=%s!UserID=%s!\ str, strDescription, strServer, strUID); mlen = strlen(Attributes); for (i=0; i if (Attributes[i] == '!') Attributes[i] = '\\0'; } if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,\"Oracle OraHome92\\0\ return 3; else in return -3; break; default: return -4; break; } } 本文来自CSDN博客,转载请标http://blog.csdn.net/freexj/archive/2008/04/04/2250060.aspx 明出处: 因篇幅问题不能全部显示,请点此查看更多更全内容