2设置ODBC数据源.docx
《2设置ODBC数据源.docx》由会员分享,可在线阅读,更多相关《2设置ODBC数据源.docx(15页珍藏版)》请在冰豆网上搜索。
![2设置ODBC数据源.docx](https://file1.bdocx.com/fileroot1/2022-11/30/6deb0bdb-52bb-4458-be3e-a7655a693281/6deb0bdb-52bb-4458-be3e-a7655a6932811.gif)
2设置ODBC数据源
目录
数据源介绍2
ODBC的标准2
ODBC的体系结构2
ODBC驱动程序3
使用管理器设置ODBC数据源5
通过管理器设置ACCESS数据源7
通过管理器设置SQLServer数据源8
动态加载数据源9
通过修改注册表加载数据源9
通过ODBCAPI加载数据源12
特殊数据源的连接方式13
文件数据源的简介及应用13
远程数据库连接15
为了使ODBC能与数据库一起工作,必须把数据库注册到ODBC驱动程序管理器。
数据源介绍
ODBC的工作依赖于数据库制造商提供的驱动程序,使用ODBCAPI的时候,Windows的ODBC管理程序把数据库访问的请求传递给正确的驱动程序,驱动程序在使用SQL语句指示DBMS完成数据库访问工作。
为了使ODBC能与数据库一起工作,必须把数据库注册到ODBC驱动程序管理器,这项工作可以通过定义一个DSN(DataSourceName,数据源名称)来完成。
在使用ODBC访问数据库时,必须通过这个注册的DSN。
所以一个数据源信息至少应该包括数据库文件名、系统(本地或远程)、文件夹等信息,同时要给数据源命名。
用户可以定义以下三种类型的数据源:
●用户数据源:
作为位于计算机本地的用户数据源而创建的,并且只能被创建这个数据源的用户所使用。
●系统数据源:
作为属于计算机或系统而不是特定用户的系统数据源而创建的,用户必须有访问权限才能使用。
●文件数据源:
指定到文件中作为文件数据源而定义的,任何已经正确的安装了驱动程序的用户节课以使用这种数据源。
ODBC的标准
ODBC定义了一个标准的调用层接口(CLI)。
每个支持ODBC的DBMS需要不同的驱动程序,驱动程序实现ODBCAPI中的函数。
当需要改变驱动程序时,应用程序不需要重新编译或者重新链接,只是动态加载新的驱动程序,并调用其中的函数即可。
如果要同时访问多个DBMS系统,应用程序可加载多个驱动程序。
使用相同的源代码的应用程序访问不同的DBMS,体现了ODBC的数据独立性。
ODBC的体系结构
ODBC总体结构有4个组件:
●应用程序:
执行处理并调用ODBCAPI函数,以提交SQL语句并检索结果
●驱动程序管理器(DriverManager):
根据应用程序的需要加载/卸载驱动程序,处理ODBC函数的调用,或把它们传送到驱动程序。
●驱动程序:
处理ODBC函数调用,提交SQL请求到一个指定的数据源,并把结果返回到应用程序。
如果有必要,驱动程序修改一个应用程序请求,以使请求与相关的DBMS支持的语法一致。
●数据源:
包括用户要访问的数据及其相关的操作系统、DBMS及用于访问DBMS的网络平台。
ODBC驱动程序的使用把应用程序从具体的数据库调用中隔离出来,驱动程序管理器针对特定数据库的各个驱动程序进行集中管理,并向应用程序提供统一的标准接口,这就为ODBC的开放性奠定了基础。
图:
ODBC部件关系
ODBC驱动程序
ODBC驱动程序是一个用以支持ODBC函数调用的模块(在Windows下通常是一个DLL),每个驱动程序对应于相应的数据库,当应用程序从基于一个数据库系统移植到另一个时,只需要更改应用程序中的、由ODBC管理程序设定的、与相应数据库系统对应的别名即可。
ODBC使用层次的方法来管理数据库,在数据库通信结构的每一层,对可能出现依赖数据库产品自身特性的地方,ODBC都引入一个公共接口以解决潜在的不一致性,从而很好的解决了数据库系统应用程序的相对独立性。
从结构上分,ODBC分为单束式和多束式两类。
1、单束式驱动程序
单束式驱动程序介于应用程序和数据库之间,像中介驱动程序一样,提供一个统一的数据访问方式。
当用户进行数据库操作时,应用程序传递一个ODBC函数调用给ODBC驱动程序管理器,由ODBCAPI判断该调用是由它直接处理并将结果返回,还是送交驱动程序执行并将结果返回。
由上可见,单束式驱动程序本身是一个数据库引擎,由它直接可完成对数据库的操作,尽管该数据库可能位于网络的任何地方。
2、多束式驱动程序
多束式驱动程序负责在数据库引擎和客户应用程序之间传送命令和数据,它本身并不执行数据处理操作,只是作为网络通信协议的一个界面。
前端应用程序提出对数据库处理的请求,该请求转给ODBC驱动程序管理器,驱动程序管理器依据请求的情况,就地完成或传给多束式驱动程序,多束式驱动程序将请求翻译为特定厂家通信接口(例如Oracle的SQLNet)所能理解的形式并交与接口去处理,接口把请求经网络传送给服务器上的数据引擎,服务器处理完后把结果发回数据库通信接口,再依次传回给应用程序。
图:
多束式驱动程序传送数据的流程图
使用管理器设置ODBC数据源
ODBC数据源管理器(Administrator)负责安装驱动程序、管理数据源,并帮助程序员跟踪ODBC的函数调用。
在ODBC中,应用程序不能直接存取数据库,它必须通过管理器和数据库交换信息。
ODBC数据源管理器负责将应用程序的SQL语句及其他信息传递给驱动程序,而驱动程序则负责将运行结果返回应用程序。
在Windows95或者Windows98下,ODBC数据源管理器通过【控制面板】->【32bitODBC】打开,而在Windows2000或者WindowsXP下,通过【控制面板】->【管理工具】->【数据源(ODBC)】打开,其界面如图:
1)用户数据源DSN:
ODBC用户数据源存储了如何与指定数据库提供者连接的信息,只有当前用户可见,而且只能用于当前计算机上。
这里的当前计算机是指这个配置只对当前的计算机有效,而不是说只能配置本机上的数据库。
他可以配置局域网中另一台计算机上的数据库。
2)系统数据源DSN:
ODBC系统数据源存储了如何与指定数据库提供者连接的信息,系统数据源对当前计算机上的所有用户都是可见的,包括NT服务。
也就是说在这里配置的数据源,只要是这台计算机的用户都可以访问。
3)文件DSN:
ODBC文件数据源允许用户连接数据提供者,文件DSN可以由安装了相同驱动程序的用户共享,这是介于用户DSN和系统DSN之间的一种共享情况。
4)驱动程序:
列出了本机上所有安装的数据库驱动程序,里面列举了每个驱动程序的名称、版本、提供商公司、驱动程序文件名以及安装日期。
5)跟踪:
ODBC跟踪允许创建调用ODBC的日志,提供给技术人员查看,里面可以设定日志的路径和文件名。
技术人员通过这里面的信息可以看到本机上所有的数据库访问的时间、用户以及出错信息等错误情况。
也可以通过这个辅助调试应用程序,可以启动VisualStudio的分析器,来进行ODBC的跟踪。
6)连接池:
连接池允许应用程序重用原来打开的连接句柄,这样可以节省到服务器的往返过程。
7)关于:
列出了所有的ODBC的核心文件
通过管理器设置ACCESS数据源
这里以Access数据库BIBLIO.mdb为对象,介绍如何配置Access数据源,具体步骤如下:
打开数据源管理器->在“用户DSN”标签页中单击【添加】按钮->“创建新数据源”->选择“DriverdoMicrosoftAccess(*.mdb)”->“ODBCMicrosoftAccess安装”,单击【选择】按钮,选择要配置的数据库文件并输入数据原名和说明字符串,单击【确定】按钮就可以了。
通过管理器设置SQLServer数据源
打开数据源管理器->在“用户DSN”标签页中单击【添加】按钮->“创建新数据源”->选择“SQLServer”->“创建到SQLServer的新数据源”->在“名称”文本框中输入test,描述可以不要,在服务器中选择local(如果是网络数据源,要选择合适的网络服务器),【下一步】->选择“使用用户输入登录ID和密码的SQLServer验证”,分别在“登录ID”、“密码”后输入SQLServer的账号和密码。
->“更改默认的数据库为”选项下选中test->一些额外的设置一般默认就可以->弹出“ODBCMicrosoftSQLServer安装”对话框,里面显示了前面的所设置的数据源配置信息,如果准确无误,单击【测试数据源】,如果顺利的话就会显示数据源建立成功。
->OVER
动态加载数据源
通过ODBC数据源管理器手工配置ODBC数据源的方法,对于一般用户而言,可能是一件比较空难的工作。
而在实际应用中,往往在同一个应用程序中访问不同的数据源,因而采用一般的加载方法就有了无法克服的缺陷。
为能在程序中完成这一工作,方便应用程序的使用,下面介绍在VisualC++6.0中两种动态加载ODBC系统数据源的方法,即通过程序执行而自动设置好ODBC数据源,无须再人工设置。
通过修改注册表加载数据源
当用户在控制面板中配置好ODBC数据源后,Windows系统便在注册表中加入了一些子键来存储用户的配置结果。
当应用程序需要用到数据源时,Windows便会通知底层接口查阅注册表中该数据源的配置。
如果配置的数据源是用户DSN数据源,Windows系统便会修改注册表的HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI子键,如果配置的数据源是系统数据源,Windows系统便会修改注册表的HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI子键。
因此,可以在应用程序中使用WindowsAPI中的注册表编辑函数来完成Windows所做的工作,这样就可以达到动态加载数据源的目的。
对于不同类型的数据源,注册表的修改也各有不同,但基本上都要修改两个地方。
一个是在ODBC.INI子键下建立一个与数据源描述名同名的子键,并在该子键下建立与数据源配置相关的项;另一个是在\ODBC.INI\ODBCDataSources子键下建立一个新项以便告诉驱动程序管理器ODBC数据源的类型。
下面以配置一个MicrosoftAccess数据源为例给出实现此功能的函数代码,相关工程为CodeCtrlOdbc
BOOLCCodeCtrlOdbcDlg:
:
LoadDbSource(
CStringstrSourceName,//数据源代码
CStringstrSourceDb,//数据库存放路径
CStringstrDescription//数据源描述字节)
{
HKEYhKey;
DWORDIDisp;
//注册数据源名
CStringstrSubKey=“SOFTWARE\\ODBC\\ODBC.INI”+strSourceName;
RegCreateKeyEx(HKEY_CURRENT_USER,
strSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&IDisp);
//注册ODBC驱动程序
CStringvalue1(“C:
\\WINNT\\System32\\odbcjt32.dll”);
RegSetValueEx(hKey,
“Driver”,
0,
REG_SZ,
(constunsignedchar*)((LPCTSTR)value1),
strlen((LPCTSTR)value1+1));
//注册数据库文件
CStringvalue2=strSourceDb;
RegSetValueEx(hKey,
“DBQ”,
0,
REG_SZ,
(constunsignedchar*)((LPCTSTR)value2),
strlen((LPCTSTR)value2+1));
DWORDvalue3=(DWORD)25;
RegSetValueEx(hKey,
“DriverID”,
0,
REG_DWORD,
(constBYTE*)&value3,
Sizeof(DWORD));
CStringvalue4(“MsAccess”);
RegSetValueEx(hKey,
“FIL”,
0,
REG_SZ,
(constunsignedchar*)((LPCTSTR)value4),
Strlen((LPCTSTR)value4)+1);
DWORDvalue5=(DWORD)0;
RegSetValueEx(hKey,
“SafeTransactions”,
0,
REG_DWORD,
(constBYTE*)&value5,
Sizeof(DWORD));
CStringvalue6(“”);
RegSetValueEx(hKey,
“UID”,
0,
REG_SZ,
(constunsignedchar*)((LPCTSTR)value6),
Strlen((LPCTSTR)value6)+1);
ReturnTRUE;
}
通过ODBCAPI加载数据源
Windows系统子目录中的动态链接库Odbcinst.dll提供了一个可以动态的添加、修改和删除数据源的函数SQLConfigDataSource()。
由于VisualC++6.0的默认库文件中不包含该函数,因此在使用该函数之前需要将odbcinst.h文件包含在工程的头文件中。
在工程的Setting属性的Link属性页的Object/librarymodules编辑框中添加odbc32.lib,同时保证系统目录system32下有文件odbccp32.dll。
该函数原型如下:
BOOLSQLConfigDataSource(HWNDhwndParent,WORDfRequest,LPCSTRlpszDriver,LPCSTRlpszAttributes);
hwndParent:
父窗口句柄。
如果该值为NULL,将不会显示与父窗口相关的对话框。
fRequest:
表示配置的类型,取值如下:
ODBC_ADD_DSN:
添加一个新的用户数据源
ODBC_CONFIG_DSN:
修改(配置)一个已存在的用户数据源
ODBC_REMOVE_DSN:
删除一个已存在的用户数据源
ODBC_ADD_SYS_DSN:
添加一个新的系统数据源
ODBC_CONFIG_SYS_DSN:
修改(配置)一个已存在系统数据源
ODBC_REMOVE_SYS_DSN:
删除一个已存在的系统数据源
lpszDriver:
用于传递数据库引擎的名字,等同于方法一中的strDbType变量
lpszAttributes:
是关键字的值
以MicrosoftAccess为例,设置数据源名为BIBLIO,数据源描述为“示例数据源”,那么在需要动态加载数据源的地方加入下列代码即可:
:
:
SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,
“MicrosoftAccessDriver(*.mdb)”,
“DSN=BIBLIO\0Descirption=示例数据库”);
特殊数据源的连接方式
文件数据源的简介及应用
ODBC文件数据源允许用户连接数据提供者,文件DSN可以由安装了相同驱动程序的用户共享,这是介于用户DSN和系统DSN之间的一种共享情况。
建立文件数据源的好处是连接信息存储在一个实际的文件中。
不止一个用户可以访问这个文件。
而且,如果需要把Web应用程序从一种Web服务器移植到另一种Web服务器上,只需要移植这个文件即可。
除了用ODBC数据源管理器外,还可以通过函数SQLDriverConnect来添加文件数据源,其定义如下:
SQLRETURNSQLDriverConnect(
SQLHDBCConnectionHandle,//连接句柄
SQLHWNDWindowHandle,//窗口句柄
SQLCHAR*InConnectionString,//输入的连接字符串
SQLSMALLINTStringLength1,//InConnectionString的长度
SQLCHAR*OutConnectionString,//输出字符串缓冲区的地址
SQLSMALLINTBufferLength,//预设的输出字符串缓冲区大小
SQLSMALLINT*StringLength2Ptr,//返回实际输出字符串缓冲区的大小
SQLUSMALLINTDriverCompletion);//可以取SQL_DRIVER_PROMPT、
SQL_DRIVER_COMPLETE、
SQL_DRIVER_COMPLETE_REQUIRED
SQL_DRIVER_NOPROMPT等几个值。
调用时连接字符串中带参数SAVEFILE=file_name。
如果该连接成功,ODBC驱动程序将在SAVEFILE参数所指向的位置创建带连接参数的文件数据源,与文件数据源进行连接的代码如下:
#include
#include
#include
#include
#include
#include
#defineMAXBUFLEN255
SQLHENVhenv=SQL_NULL_HENV;
SQLHDBChdbc1=SQL_NULL_HDBC;
Intmain()
{
RETCODEretcode;
//如果成功,在ODBC默认目录下创建MyFileDSN.dsn文件数据源
SQLCHARszConnStrIn[MAXBUFLEN]=
“SAVEFILE=MyFileDSN;DRIVER={SQLServer};SERVER=MySQL;”
“NETWORK=dbmssocn;UID=sa;PWD=MyPassWord;”;
SQLCHARszConnStrOut[MAXBUFLEN];
SQLSMALLINTcbConnStrOut=0;
//分配环境句柄
retcode=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);
//使用ODBC3.0版本
retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
//分配ODBC连接句柄,并且连接数据源
retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc1);
retcode=SQLDriverConnect(hdbc1,NULL,zConnStrIn,SQL_NTS,
szConnStrOut,MAXBUFLEN,&cbConnStrOut,SQL_DRIVER_NOPROMPT);
//断开连接,用新的连接字符串测试刚刚创建的文件数据源是否成功
SQLDisconnect(hdbc1);
strcpy(szConnStrIn,”FILEDSN=MyFileDSN;UID=sa,PWD=MyPassWord;”);
retcode=SQLDriverConnect(hdbc1,//Connectionhandle
NULL,//窗口句柄
szConnStrIn,//输入字符串
SQL_NTS,//Null_terminatedstring
szConnStrOut,//输出字符串的地址
MAXBUFLEN,//输出字符串的长度
&cbConnStrOut,//记录实际输出字符串长度的地址
SQL_DRIVER_NOPROMPT);
//清理环境
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
return(0);
}
远程数据库连接
远程的一个服务器上运行了SQLServer,只要在访问程序中注册该数据库的一个数据源,访问该远程数据库的方法与本地数据库是一样的。
通过SQLConfigDataSource()函数注册远程数据源。
(该函数也可以注册本地数据源,在“ODBCAPI加载数据源一节中”)
CStringm_strIP=“166.111.8.238”//定义IP
BOOLm_bLocalDB=FALSE;//定义是本地数据源还是远程数据源
BOOLCXXXApp:
:
BuildODBC()
{
char*szPredix=“DSN=Sinoname\0DESCRIPTION=SinoSename\0Server=”;
char*szSuffix=
“\0ADDRESS=MyServer\0NETWORK=dbmssocn\0DATABASE=Sinosrch\0”;
char*szLocalCfg[1024]=“DSN=Sinoname\0DESCRIPTION=SinoSename\0”
“SERVER=(local)\0ADDRESS=MyServer\0NETWORK=dbmssocn\0”
“DATABASE=Sinoname\0”
charszAttributes[1024];
if(m_bLocalDB)
{
//访问本地数据源
memcpy(szAttributes,szLocalCfg,1024);
}
else
{
//访问远程数据源
memset(szAttributes,0,1024);
memcpy(szAttributes,szPredix,44);
memcpy(szAttributes+44,m_strIP,m_strIP.GetLength());
memcpy(szAttributes+44+m_strIP.GetLength(),szSuffix,53);
}
//注册数据源
returnSQLConfigDataSource(NULL,
ODBC_ADD_DSN,
“SQLServer”,
szAttributes);
}//注册完成之后就可以按本地数据源一样访问了。