1、编写数据库应用程序必看编写数据库应用程序必看强烈推荐第一节 ODBC API 一、简介现在最流行的联接数据源的方法,是ODBC(Open Database ConnectivityAPI),字面意思是“打开数据库联接”,这是一种用C/C+ 编的应用程序接口,是属于Windows 的一部分。无论对任何一种客户/ 服务器关系型数据库接口(RDBMS), 还是目前最流行的索引顺序访问方法(ISAM)数据库(Jet,Foxpro)以及电子表格,都能找到ODBC驱动程序。使用ODBC数据源的一个最有利的优点是,只要利用ODBC联接上数据库,那么,不论何种数据库,在应用程序内的处理方法都是相同的,这就为设
2、计大型通用数据库处理程序,提供了现实的保证。ODBC是由Windows 的动态链接库(DLL) 组成的,内部提供了一系列的函数,它由两组函数组成,提供基本的数据库服务:1) 添加、配置和删除ODBC数据源:数据源是对数据库的有名联接,数据源的名字是由数据库的提供者命名的,通常称为数据源名(DSN) ,注意把数据源的名字和数据库的名字区别开来。ODBC使用Odbcinst.dll库来配置和删除数据源。而它的可执行的程序,是Odbc32.exe。它的图标位于“控制面板”窗口中(ODBC数据管理器)。2) 管理从客户前端到数据库服务器的查询语句和其它SQL 语句的通讯,并返回查询结果。数据源的ODB
3、C驱动程序将客户端送来的SQL 语句送到数据库驱动程序,数据库驱动程序处理SQL 语句后,再通过数据源的ODBC驱动程序将结果返回到应用程序。事实上,连接数据原有两种方式,一种是直接调用数据表名(Table),这种方法是把所有的表内容全部传给客户端,当表很大时,将是一种效率很差的传输方式。第二种是使用SQL 语句,它只把符合要求的内容传递下去,因此应用效率比较高,大型数据库一般都采用SQL 语句的方式。下面简单介绍一下ODBC 驱动程序。ODBC驱动程序分为单层和多层两种:单层的ODBC不能直接处理SQL 语言,它是将SQL 语句分解成一系列长的低级指令,直接操作数据库文件(Dbase、Fox
4、pro、Paradox、Excel)。多层ODBC依靠客户/服务器RDBMS来处理SQL 语句,由于服务器只传回符合SQL 条件的内容,网络流量被最小化。VB 6.0中包括SQL server 4.2X 、6.X、7.0 的32位ODBC驱动程序,即Sqlsvr32.dll,虽然列表上同样也包括Qracle 驱动程序。但是,实际使用时还是需要在客户端计算机上安装Qracle公司提供的动态联接库。二、ODBC添加新数据源方法:Windows -控制面板 -资源管理器(Windows 2000为管理工具) -ODBC数据源(32位)。打开“ODBC数据管理器”这里首先要决定的是采用“用户DSN”还
5、是“系统DSN”用户DSN: 该数据源名只提供给用该用户名登陆的用户。在网络使用时主要用于在客户端定义数据源。系统DSN: 该数据源名提供给用任何用户名登陆的用户,包括在网络上(NT)使用。添加:选择驱动程序。1)选择Access,-完成 安装:数据源名:自己给出数据库 “选择”-选择相应的数据库。确定: 我们可以在数据源列表中看到新定义的数据源名字。2)选择SQL Server -完成 建立新的数据源到SQL Server命名数据源:自己给出服务器:给出服务器名如果从列表中选择服务器名称,则不需要更多的配置。如果使用相同的计算机作为 SQL Server,可以在此服务器框中输入“(local
6、)”(本地)。然后用户可连接到 SQL Server 的本地副本,即便正在运行 SQL Server 的非网络版本。在说明框可以写进关于数据源可选的描述性说明。例如,“所有员工的工资和销售情况”。下一步使用用户登陆ID和密码的SQL Server验证输入用户名和密码下一步 -完成配置可以看出,不同的驱动程序配置方法不尽相同。后面就可以看到,使用ODBC数据源名并不是唯一的选择,我们也可以使用直接用数据库名或者服务器名(SQL Server) 联接的方式,这时,并不需要事先设置ODBC数据源的名字。第二节 DAO 和 ADO 的技术状态1994年,微软在Access 2.0 中首先引入了16位的
7、DAO (Data Accessing Object 数据访问对象),以实现和Jet 数据库引擎的连接,这是允许程序员操纵Jet 引擎的第一个面向对象的接口。DAO 提供了一个复杂的可编程数据对象的层次模型,由上到下分别是:DBEngineWorkspaceDatabaseTableDefQueryDefRecorsetDAO 的使用非常复杂,例如,为了引用 Recorset,必须从上到下逐级引用:DIM wname As DAO.WorkspaceDIM wm1 As DAO.DatabaseDIM wm2 As DAO. TableDefDIM wm3 As DAO.QueryDefDIM
8、 wm4 As DAO.Recorsetset wname=DBEngine.Workspace(0).更重要的,DAO/Jet 并不适合客户/服务器模式的数据库系统,于是,微软又开发出了RDO(Remote Data Object 远程数据对象), 和RDC 控件(在MS RemoteData Control 6.0下),解决了客户/服务器模式下,开发象SQL Server 或 Oracle 这些大型远程数据库的困难。VB提供的RDO 组件在工程-引用:客户端:MS Remote Data Object 2.0服务器端:MS Remote Data Servers 2.5 Library和M
9、S Remote Data Servers Server 2.5 Library显然,这种模式需要编写服务器端程序,在某些情况下可能是不现实的。继RDO 之后,微软又提出了全新的ADO 技术(ActiveX Data Object),ADO 是DAO 和RDO 的继承者,它基于微软提出来的OLE DB 数据访问模式,它可以处理目前几乎全部关系型数据库和非关系型数据库系统。而且,它是专门为大范围的商业数据库系统设计的,ADO 比DAO 占用内存少,所以它更适合大流量和大事务量的网络计算机系统。ADO 的影响很大,现在几乎所有的非微软开发环境都内置了ADO 驱动程序。ADO 的使用也相当方便,利用
10、ADODC 控件(在MS ADO Data Control 6.0(OLEDB)下),可以在本地计算机上获取本地和远程的数据源,并且可以立刻测试联接是否成功。ADODC 控件,是以ADO 为父类的一个子类,所以,它继承了ADO 的几乎绝大多数属性事件和方法,同时,也加入了自己的属性事件和方法。这些属性事件和方法,又大多数套用于一种原来基于DAO 的控件Data,为熟悉Data控件的程序员做一个合理的过渡,并且,加入了和数据绑定控件连接的内容。所以,同一种目的,在ADODC 中可以有两种方式解决,这样做的好处是给程序员带来了方便,更重要的,ADODC 和数据绑定控件连接非常方便,但代价是无疑降低
11、了效率。因此,尽管使用ADODC 控件处理数据库问题相当方便,但是,在更多的大型数据库系统的设计中,人们还是使用直接调用ADO 类的方式,因为这样一来,程序的效率往往更高,更灵活。鉴于这个情况,在下面的讨论中,我们两种情况都进行讨论,具体怎么用,要看项目的需要。当然首先是从源头说起,先研究ADO 。还需要说明的是:ADODC 提供了一整套的自动联接方式,这些方式,十分方便,但是,如果不明白原理,往往联接以后还是感到自己心中无数,所以,即使您使用ADODC ,但是仔细的研究ADO 本身的东西,也还是很有必要的。同时,利用ADODC 提供的信息,也给以编程为主的ADO提供了方便,这些我们后面都会加
12、以介绍。最近一两年,ADO 技术又有了长足的发展,这里首先要提到微软的Visual Studio.Net 平台,在这个平台上的主导语言是Visual Basic,Visual C+,Visual C# ,对于VB 6.0的编程人员,过渡到VB.NET是理所当然的事情。微软公司对VB升级到VB.Net的同时,对数据访问模型进行了翻天覆地的升级。把原来的ADO 模型升级为全新的ADO.NET数据源,原来最重要的RecordSet 现在消失了,取而代之的是DataSet 和DataReader,而且不再像原来RecordSet 那样一次只读取一条记录,而是读取整个数据库,然后在内存中建立一个映像,从
13、而实现了断开方式数据库连接和内存管理自动化,这是微软的一个重大的技术突破。但是,这并不等于说学习ADO 技术就没有意义了,首先,由于技术的继承性,ADO.NET 继承了ADO 的大部分编程方法,另一方面,VB.NET也还是保留了原来在VB 6.0中ADO 的COM 组件,这就是说,在VB.Net中,我们还是可以用在VB 6.0中完全相同的方法来编写数据库程序,这对于中小规模的数据库管理系统,也是很有意义的。如果您主要是处理Access数据库,那么使用专为Access数据库编写的DAO 技术将更直接效率更高。因此,在VB.Net中也仍然保留了DAO 的COM 组件,但是,更改了驱动程序,解决了在
14、VB 6.0中DAO 不能驱动Access 2000 的问题,因此也得到了广泛的应用。下面,我们就来仔细的研究ADO 和DAO 的有关问题。在课程的最后,我们将通过一两个例子,来说明VB.NET中数据库处理的一些方法和特点。 第三节 ADO 最基本的内容ADO 的内容比较多,我想还是分两个层,先讨论最基本最重要的内容。一、ADO 组件的引用 ADO 实际上是个COM 组件,它的顶层有三个对象:Connection :指定数据源,建立和数据源的连接;Command :对数据源执行指定的命令,接受SQL 语句,表名,存储过程的名字,执行SQL 查询,更新数据,插入记录等;Recordset: 来自
15、表或命令执行结果的记录全集,操纵来自提供者的几乎所有数据。要应用ADO 组件,必须在工程-引用:Ms Activex data object 2.7 Library把ADO 这个COM 组件调入当前系统。用F2 可以看到这个组件的状况。库的名字为ADODB,也就是在当初设计组件的时候,工程名起的是是ADODB,所以,应用这三个类都要构造相应的实例,引用时必须作如下声明,:Dim Cnn As ADODB.ConnectionDim Cmm As ADODB.CommandDim Reco As ADODB.Recordset其中,Cnn,Cmm和Reco 是用户自定义的对象变量,为了表述方便,
16、后面的讨论我们都以这组名字作为表达的基础。 真正使用,就要通过New 来建立一个ADO 的实例。Set Cnn = New ADODB.ConnectionSet Cmm = New ADODB.CommandSet Reco = New ADODB.Recordset有时,希望定义的同时构造实例,也可以写成(ADODB一般可以不写):Dim Cnn As New ConnectionDim Cmm As New CommandDim Reco As New Recordset值得指出的是,如果您直接使用ADODC控件,那上述方法都已经在ADODC内部完成了,不需要程序员自己来写。但是,如果您
17、不使用ADODC控件,而要使用ADO 这个类来编写数据库系统的时候,就需要使用引用COM 的标准方法。一、数据库连接的建立可以有四种连接方式:第一种(用Open)Cnn.Provider = 驱动程序Cnn.Open 数据库名,用户名,密码 例Cnn.Provider = Microsoft.Jet.OLEDB.4.0Cnn.Open Add.path & 奖金数据库.mdb 这里App.path给出了当前路径(该语句在VB.NET中变为Application.startuppath),这样就可以实现相对路径调用数据库了。 第二种(用连接字符串)Connection对象变量有一个Connect
18、ionstring,可以输入字符串,例如对于sql server数据库,字符串设置可用如下规则:Provider=SQLOLEDB.1; (提供者)Integrated Security=SSPI; (安全设置)Persist Security Info=False; (持续的安全信息)Initial Catalog=pubs; (初始的目录,或默认的数据库)Data Source=XXX-PE (数据源-计算机名)请看如下的例子:Cnn.DefaultDatabase=pubs 这个属性是指定默认数据库,如果没有指定数据库名,就使用这里指定的数据库名,SQL Server通常是pubsCnn
19、.Connectionstring=driver=SQL Server;Server=bigs; _uld=sa;pws=pwd其中:bigs为服务器名;sa为用户名;pwd为密码。Cnn.Mode=adModeShareExclusive以独占方式打开(后面会讨论)Cnn.open第三种(使用DSN 数据源名)Cnn.Connectionstring=DSN=pubs;UID=*;PWD=* 由于建立DSN 时就已经提供了诸如上面有关的各种数据,所以这里只需要直接调用名字就可以了。Cnn.open第四种(直接用Open打开)Cnn.Open DSN数据源名,用户名,密码实例,第一部分,建立三
20、个数据库的连接:-建立三个Button,分别用三种方法打开三个库,运行时不出错就代表已连接。由于后面要用一个显示画面,所以一次只能打开一个数据库,看看这里是怎么解决这个问题的?-Dim Cnn As New ConnectionDim Cmm As New CommandDim Reco As New RecordsetDim Cnn1 As New ConnectionDim Cnn2 As New ConnectionDim Kzr, Kzc, kzc1, kzc2, Nd, inname, TnamePrivate Sub Command2_Click()用字符串连接SQL SERVER
21、 数据库If Kzc = True Then Cnn.CloseKzc = TrueIf kzc1 = True ThenCnn1.Closekzc1 = FalseEnd IfIf kzc2 = True ThenCnn2.Closekzc2 = FalseEnd IfCnn.ConnectionString = Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=XXX-PE注意一下计算机名要更改Cnn.OpenEnd SubPri
22、vate Sub Command1_Click()打开数据库的Provider+Open方法If kzc1 = True Then Cnn1.Closekzc1 = TrueIf Kzc = True ThenCnn.CloseKzc = FalseEnd IfIf kzc2 = True ThenCnn2.Closekzc2 = FalseEnd IfCnn1.Provider = Microsoft.Jet.OLEDB.4.0inname = App.Path & 奖金数据库.mdbCnn1.Open innameTname = 奖金End SubPrivate Sub Command3_
23、Click()直接使用OPEN 和DSN数据源打开数据库If kzc2 = True Then Cnn2.Closekzc2 = TrueIf Kzc = True ThenCnn.CloseKzc = FalseEnd IfIf kzc1 = True ThenCnn1.Closekzc1 = FalseEnd IfCnn2.Open MysqlEnd SubPrivate Sub Form_Load()Kzr = FalseKzc = Falsekzc1 = Falsekzc2 = FalseEnd Sub-二、应用Recordset打开表前面已经提到,Recordset对象是用于处理来自
24、表或命令执行结果的记录全集,操纵来自提供者的几乎所有数据,所以,处理数据库问题,Recordset是处在重中之重的位置,由于这是个COM 对象,应用的时候同样需要声明,并且构造一个实例:Dim Reco As ADODB.RecordsetSet Reco = New ADODB.RecordsetReco.Open 数据源, Cnn ,指针形态,锁定方式其中:数据源:表名,或者SQL语句指针形态:0 向后指针(默认)1 索引键集3 动态记录(常用)4 静态记录锁定方式:1 只读(默认) 2 编辑更新3 Updata更新4 批次更新实例:关于Recordset的打开-在相应的按钮事件中加上Re
25、co.Open-Private Sub Command2_Click().Tname = employeeReco.Open Tname, Cnn, 3, 3双向指针,Updata更新Kzr = TrueEnd SubPrivate Sub Command1_Click().Tname = 奖金Reco.Open Tname, Cnn1, 3, 3Kzr = TrueEnd SubPrivate Sub Command3_Click().Tname = 基本表Reco.Open Tname, Cnn2, 3, 3Kzr = TrueEnd Sub-三、几个重要的Connection对象方法1)
26、open方法语法:Cnn.Open Connectionstring,UserID,password注意:Connection的Open方法是连接了数据库,但并没有打开表。2)Close方法Cnn.Close关闭已经打开的连接,但该对象还保留在内存中3)清除内存Set Cnn=Noting真正的消除掉四、取得记录集中的数据Reco.(字段名)Reco.Fields(index).Value 内容Reco.Fields(index).Name 字段名Reco.Fields(index).type 字段类型Reco.Fields(i).ActualSize 字段长度Reco.Fields.Coun
27、t 字段总数记录数Reco.RecordCount 记录数N=Reco.AbsolutePosition 当前指针的位置Reco.AbsolutePosition=N 把指针定位在第N笔记录上五、指针的移动Reco.MoveFirst 指针指向第一笔记录Reco.MoveNext 指针指向下一笔记录Reco.MovePrevious 指针指向上一笔记录Reco.MoveLast 指针指向最后一笔记录-做一个frame用于显示,内部放置9个Textbox和Label数组。开始的时候frame1.visible=false。VarType()检测数据库输出是否为空(MULL),因为空数据的送出会显
28、示错误信息,应避免这种情况。Showfiel()用于显示数据Myscreen()用于设置初始屏幕 -Private Sub Showfiel()For i = 0 To Nd - 1If VarType(Reco.Fields(i).Value) 1 ThenText1(i).Text = Reco.Fields(i).ValueElseText1(i).Text = End IfNextEnd SubPrivate Sub Myscreen()Nd = Reco.Fields.CountIf Nd = 9 ThenNd = 9End IfFor i = 0 To 8Label1(i).Visible = FalseText1(i).Visible = FalseNextFor i = 0 To Nd -
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1