用户名  找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 640|回复: 0

编写数据库应用程序必看...!!!!

[复制链接]
发表于 2005-12-22 17:38:44 | 显示全部楼层 |阅读模式
编写数据库应用程序必看...

第一节  ODBC API
  
  一、简介
  现在最流行的联接数据源的方法,是ODBC(Open Database Connectivity
API),字面意思是“打开数据库联接”,这是一种用C/C++ 编的应用程序接
口,是属于Windows 的一部分。无论对任何一种客户/ 服务器关系型数据库接
口(RDBMS), 还是目前最流行的索引顺序访问方法(ISAM)数据库(Jet,
Foxpro)以及电子表格,都能找到ODBC驱动程序。
  使用ODBC数据源的一个最有利的优点是,只要利用ODBC联接上数据库,那
么,不论何种数据库,在应用程序内的处理方法都是相同的,这就为设计大型
通用数据库处理程序,提供了现实的保证。
  ODBC是由Windows 的动态链接库(DLL) 组成的,内部提供了一系列的函
数,它由两组函数组成,提供基本的数据库服务:
  1) 添加、配置和删除ODBC数据源:
  数据源是对数据库的有名联接,数据源的名字是由数据库的提供者命名的,
通常称为数据源名(DSN) ,注意把数据源的名字和数据库的名字区别开来。
  ODBC使用Odbcinst.dll库来配置和删除数据源。而它的可执行的程序,是
Odbc32.exe。它的图标位于“控制面板”窗口中(ODBC数据管理器)。
  2) 管理从客户前端到数据库服务器的查询语句和其它SQL 语句的通讯,
并返回查询结果。
  数据源的ODBC驱动程序将客户端送来的SQL 语句送到数据库驱动程序,数
据库驱动程序处理SQL 语句后,再通过数据源的ODBC驱动程序将结果返回到应
用程序。
  事实上,连接数据原有两种方式,一种是直接调用数据表名(Table),
这种方法是把所有的表内容全部传给客户端,当表很大时,将是一种效率很差
的传输方式。第二种是使用SQL 语句,它只把符合要求的内容传递下去,因此
应用效率比较高,大型数据库一般都采用SQL 语句的方式。
  下面简单介绍一下ODBC 驱动程序。
  ODBC驱动程序分为单层和多层两种:
  单层的ODBC不能直接处理SQL 语言,它是将SQL 语句分解成一系列长的低
级指令,直接操作数据库文件(Dbase、Foxpro、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”还是“系统DSN”
  用户DSN: 该数据源名只提供给用该用户名登陆的用户。在网络使用时
主要用于在客户端定义数据源。
  系统DSN: 该数据源名提供给用任何用户名登陆的用户,包括在网络上
(NT)使用。
  添加:选择驱动程序。
  1)选择Access,-〉完成 安装:数据源名:自己给出
               数据库  “选择”-〉选择相应的数
                        据库。
          确定: 我们可以在数据源列表中看到新定义的数
            据源名字。
  2)选择SQL Server -〉完成 建立新的数据源到SQL Server
           命名数据源:自己给出
            服务器:给出服务器名
            如果从列表中选择服务器名称,则不需要更
           多的配置。
            如果使用相同的计算机作为 SQL Server,
           可以在此服务器框中输入“(local)”(本地)。
           然后用户可连接到 SQL Server 的本地副本,即
           便正在运行 SQL Server 的非网络版本。
            在说明框可以写进关于数据源可选的描述性
           说明。例如,“所有员工的工资和销售情况”。
           下一步
           使用用户登陆ID和密码的SQL Server验证
           输入用户名和密码
           下一步 -〉完成配置
  可以看出,不同的驱动程序配置方法不尽相同。
  后面就可以看到,使用ODBC数据源名并不是唯一的选择,我们也可以使
用直接用数据库名或者服务器名(SQL Server) 联接的方式,这时,并不需
要事先设置ODBC数据源的名字。
      第二节  DAO 和 ADO 的技术状态
  1994年,微软在Access 2.0 中首先引入了16位的DAO (Data Accessing
Object 数据访问对象),以实现和Jet 数据库引擎的连接,这是允许程序
员操纵Jet 引擎的第一个面向对象的接口。
  DAO 提供了一个复杂的可编程数据对象的层次模型,由上到下分别是:
  DBEngine
  Workspace
  Database
  TableDef
  QueryDef
  Recorset
  DAO 的使用非常复杂,例如,为了引用 Recorset,必须从上到下逐级
引用:

  DIM wname As DAO.Workspace
  DIM wm1 As DAO.Database
  DIM wm2 As DAO. TableDef
  DIM wm3 As DAO.QueryDef
  DIM wm4 As DAO.Recorset
  set 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
      和
      MS Remote Data Servers Server 2.5 Library
  显然,这种模式需要编写服务器端程序,在某些情况下可能是不现
实的。
  继RDO 之后,微软又提出了全新的ADO 技术(ActiveX Data Object
),ADO 是DAO 和RDO 的继承者,它基于微软提出来的OLE DB 数据访问
模式,它可以处理目前几乎全部关系型数据库和非关系型数据库系统。
  而且,它是专门为大范围的商业数据库系统设计的,ADO 比DAO 占用
内存少,所以它更适合大流量和大事务量的网络计算机系统。
  ADO 的影响很大,现在几乎所有的非微软开发环境都内置了ADO 驱
动程序。ADO 的使用也相当方便,利用ADODC 控件(在MS ADO Data
Control 6.0(OLEDB)下),可以在本地计算机上获取本地和远程的数据
源,并且可以立刻测试联接是否成功。
  ADODC 控件,是以ADO 为父类的一个子类,所以,它继承了ADO 的
几乎绝大多数属性事件和方法,同时,也加入了自己的属性事件和方法。
这些属性事件和方法,又大多数套用于一种原来基于DAO 的控件Data,
为熟悉Data控件的程序员做一个合理的过渡,并且,加入了和数据绑定
控件连接的内容。
  所以,同一种目的,在ADODC 中可以有两种方式解决,这样做的好
处是给程序员带来了方便,更重要的,ADODC 和数据绑定控件连接非常
方便,但代价是无疑降低了效率。
  因此,尽管使用ADODC 控件处理数据库问题相当方便,但是,在更
多的大型数据库系统的设计中,人们还是使用直接调用ADO 类的方式,
因为这样一来,程序的效率往往更高,更灵活。
  鉴于这个情况,在下面的讨论中,我们两种情况都进行讨论,具体
怎么用,要看项目的需要。当然首先是从源头说起,先研究ADO 。
  还需要说明的是:ADODC 提供了一整套的自动联接方式,这些方式,
十分方便,但是,如果不明白原理,往往联接以后还是感到自己心中无
数,所以,即使您使用ADODC ,但是仔细的研究ADO 本身的东西,也还
是很有必要的。同时,利用ADODC 提供的信息,也给以编程为主的ADO
提供了方便,这些我们后面都会加以介绍。
  最近一两年,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 那样一次只读取一条记录,而
是读取整个数据库,然后在内存中建立一个映像,从而实现了断开方式
数据库连接和内存管理自动化,这是微软的一个重大的技术突破。
  
  但是,这并不等于说学习ADO 技术就没有意义了,首先,由于技术
的继承性,ADO.NET 继承了ADO 的大部分编程方法,另一方面,VB.NET
也还是保留了原来在VB 6.0中ADO 的COM 组件,这就是说,在VB.Net中,
我们还是可以用在VB 6.0中完全相同的方法来编写数据库程序,这对于
中小规模的数据库管理系统,也是很有意义的。
  
  如果您主要是处理Access数据库,那么使用专为Access数据库编写
的DAO 技术将更直接效率更高。因此,在VB.Net中也仍然保留了DAO 的
COM 组件,但是,更改了驱动程序,解决了在VB 6.0中DAO 不能驱动
Access 2000 的问题,因此也得到了广泛的应用。
  下面,我们就来仔细的研究ADO 和DAO 的有关问题。在课程的最后,
我们将通过一两个例子,来说明VB.NET中数据库处理的一些方法和特点。  
  
   第三节  ADO 最基本的内容

  ADO 的内容比较多,我想还是分两个层,先讨论最基本最重要的内
容。
  一、ADO 组件的引用  
  ADO 实际上是个COM 组件,它的顶层有三个对象:
  Connection :指定数据源,建立和数据源的连接;
  Command :对数据源执行指定的命令,接受SQL 语句,表名,存储
过程的名字,执行SQL 查询,更新数据,插入记录等;
  Recordset: 来自表或命令执行结果的记录全集,操纵来自提供者
的几乎所有数据。
  要应用ADO 组件,必须在工程-〉引用:
  Ms Activex data object 2.7 Library
  把ADO 这个COM 组件调入当前系统。
  用F2 可以看到这个组件的状况。库的名字为ADODB,也就是在当初
设计组件的时候,工程名起的是是ADODB,所以,应用这三个类都要构造
相应的实例,引用时必须作如下声明,:
  Dim Cnn As ADODB.Connection
  Dim Cmm As ADODB.Command
  Dim Reco As ADODB.Recordset
  其中,Cnn,Cmm和Reco 是用户自定义的对象变量,为了表述方便,
后面的讨论我们都以这组名字作为表达的基础。
  真正使用,就要通过New 来建立一个ADO 的实例。
  Set Cnn = New ADODB.Connection
  Set Cmm = New ADODB.Command
  Set Reco = New ADODB.Recordset
  有时,希望定义的同时构造实例,也可以写成(ADODB一般可以不写):
  Dim Cnn As New Connection
  Dim Cmm As New Command
  Dim Reco As New Recordset
  值得指出的是,如果您直接使用ADODC控件,那上述方法都已经在
ADODC内部完成了,不需要程序员自己来写。但是,如果您不使用ADODC
控件,而要使用ADO 这个类来编写数据库系统的时候,就需要使用引
用COM 的标准方法。
  一、数据库连接的建立
  可以有四种连接方式:
  第一种(用Open)
  Cnn.Provider = 驱动程序
  Cnn.Open 数据库名[,用户名,密码]  
  例
  Cnn.Provider = Microsoft.Jet.OLEDB.4.0
  Cnn.Open Add.path & \\奖金数据库.mdb
  这里App.path给出了当前路径(该语句在VB.NET中变为
   Application.startuppath),这样就可以实现相对路径调用数
  据库了。  
  
  第二种(用连接字符串)
  Connection对象变量有一个Connectionstring,可以输入字符串,
例如对于sql server数据库,字符串设置可用如下规则:
  Provider=SQLOLEDB.1; (提供者)
  Integrated Security=SSPI; (安全设置)
  Persist Security Info=False; (持续的安全信息)
  Initial Catalog=pubs;  (初始的目录,或默认的数据库)
  Data Source=XXX-PE    (数据源--计算机名)
  请看如下的例子:
  Cnn.DefaultDatabase=pubs
   '  这个属性是指定默认数据库,如果没有指定数据库名,
   '就使用这里指定的数据库名,SQL Server通常是pubs
  Cnn.Connectionstring=driver={SQL Server};Server=bigs; _
           uld=sa;pws=pwd
   '其中:bigs为服务器名;sa为用户名;pwd为密码。
  Cnn.Mode=adModeShareExclusive
   '以独占方式打开(后面会讨论)
  Cnn.open
  第三种(使用DSN 数据源名)
  Cnn.Connectionstring=DSN=pubs;UID=***WD=***  
   '由于建立DSN 时就已经提供了诸如上面有关的各种数据,
   '所以这里只需要直接调用名字就可以了。
  Cnn.open
  第四种(直接用Open打开)
  Cnn.Open DSN数据源名,用户名,密码
  实例,第一部分,建立三个数据库的连接:
-----------------------------------------------------------------
  建立三个Button,分别用三种方法打开三个库,运行时不出错就代表
已连接。由于后面要用一个显示画面,所以一次只能打开一个数据库,看
看这里是怎么解决这个问题的?
-----------------------------------------------------------------
Dim Cnn As New Connection
Dim Cmm As New Command
Dim Reco As New Recordset
Dim Cnn1 As New Connection
Dim Cnn2 As New Connection
Dim Kzr, Kzc, kzc1, kzc2, Nd, inname, Tname

Private Sub Command2_Click()
'用字符串连接SQL SERVER 数据库

If Kzc = True Then Cnn.Close
Kzc = True
If kzc1 = True Then
  Cnn1.Close
  kzc1 = False
End If
  If kzc2 = True Then
  Cnn2.Close
  kzc2 = False
End If
Cnn.ConnectionString = Provider=SQLOLEDB.1;Integrated Security=SSPIersist Security Info=False;Initial Catalog=pubs;Data Source=XXX-PE
'注意一下计算机名要更改
Cnn.Open

End Sub

Private Sub Command1_Click()
'打开数据库的Provider+Open方法
If kzc1 = True Then Cnn1.Close
kzc1 = True
If Kzc = True Then
  Cnn.Close
  Kzc = False
End If
  If kzc2 = True Then
  Cnn2.Close
  kzc2 = False
End If

Cnn1.Provider = Microsoft.Jet.OLEDB.4.0
inname = App.Path & \\奖金数据库.mdb
Cnn1.Open inname
Tname = 奖金

End Sub
Private Sub Command3_Click()
'直接使用OPEN 和DSN数据源打开数据库
If kzc2 = True Then Cnn2.Close
kzc2 = True
If Kzc = True Then
  Cnn.Close
  Kzc = False
End If
  If kzc1 = True Then
  Cnn1.Close
  kzc1 = False
End If

Cnn2.Open Mysql

End Sub

Private Sub Form_Load()
Kzr = False
Kzc = False
kzc1 = False
kzc2 = False
End Sub
-----------------------------------------------------------------
    二、应用Recordset打开表
  前面已经提到,Recordset对象是用于处理来自表或命令执行结果的记
录全集,操纵来自提供者的几乎所有数据,所以,处理数据库问题,Recordset
是处在重中之重的位置,由于这是个COM 对象,应用的时候同样需要声明,
并且构造一个实例:
  
  Dim Reco As ADODB.Recordset
  Set Reco = New ADODB.Recordset
  Reco.Open 数据源, Cnn [,指针形态][,锁定方式]
  其中:数据源:表名,或者SQL语句
    指针形态:
        0 向后指针(默认)
        1 索引键集
        3 动态记录(常用)
        4 静态记录
    锁定方式:
        1 只读(默认)
        2 编辑更新
        3 Updata更新
        4 批次更新
实例:关于Recordset的打开
-------------------------------------------------------------
  在相应的按钮事件中加上Reco.Open
-------------------------------------------------------------
Private Sub Command2_Click()

.............

Tname = employee

Reco.Open Tname, Cnn, 3, 3
'双向指针,Updata更新

Kzr = True

End Sub

Private Sub Command1_Click()
...............................
Tname = 奖金

Reco.Open Tname, Cnn1, 3, 3

Kzr = True


End Sub
Private Sub Command3_Click()
....................

Tname = 基本表
Reco.Open Tname, Cnn2, 3, 3

Kzr = True


End Sub

-------------------------------------------------------------


  三、几个重要的Connection对象方法
  1)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.Count '字段总数

   记录数
      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),因为空数据的送
出会显示错误信息,应避免这种情况。
  Showfiel()用于显示数据
  Myscreen()用于设置初始屏幕  
------------------------------------------------------------------
Private Sub Showfiel()

For i = 0 To Nd - 1
  If VarType(Reco.Fields(i).Value) > 1 Then
  Text1(i).Text = Reco.Fields(i).Value
  Else
  Text1(i).Text =
  End If
Next
End Sub
Private Sub Myscreen()
Nd = Reco.Fields.Count
If Nd >= 9 Then
  Nd = 9
End If
  
For i = 0 To 8
  Label1(i).Visible = False
  Text1(i).Visible = False
Next
  
For i = 0 To Nd - 1
  Label1(i).Caption = Reco.Fields(i).Name
  Label1(i).Visible = True
  Text1(i).Visible = True
Next
  Reco.MoveFirst
  Label2.Visible = False
  frame1.visible=true
End Sub
' 在三个打开数据库的开关事件中都写上:
' Myscreen
' Showfiel
'第一个
Private Sub Command4_Click()
Reco.MoveFirst
Showfiel
End Sub
'上一个
Private Sub Command5_Click()
Reco.MovePrevious
  If Reco.BOF Then
  Reco.MoveFirst
End If
Showfiel
End Sub
'下一个
Private Sub Command6_Click()
Reco.MoveNext
If Reco.EOF Then
  Reco.MoveLast
End If
Showfiel
End Sub
'末一个
Private Sub Command7_Click()
Reco.MoveLast
Showfiel
End Sub
------------------------------------------------------------------
六、Recordst重要的方法:
  
   AddNew  创建一个新记录
   UpData  保存对当前数据的修改
   Delete  删除当前记录
   Requery 用新的SQL 查询去更新当前数据集。
------------------------------------------------------------------
增加几个功能
------------------------------------------------------------------
'增加
Private Sub Command13_Click()
Reco.AddNew
Showfiel
End Sub
'删除
Private Sub Command14_Click()
Reco.Delete
Reco.MoveNext
If Reco.EOF Then
  Reco.MoveLast
End If
Showfiel
End Sub
'更新

Private Sub Command15_Click()

'Reco.Fields(i).Type = 3为自动加一的字段ID,不能更新

  For i = 0 To Nd - 1
  If (Trim(LTrim(Text1(i).Text)) ) And (Reco.Fields(i).Type 3) Then
   Reco.Fields(i).Value = Text1(i).Text
  End If
  Next
  Reco.Update

End Sub

------------------------------------------------------------------

  七、执行SQL 语句
  执行SQL 语句是为了构造数据集,可以用两种方法:
  1)用Connection的Execute方法

  完成查询后以记录集的形式把数据传回,这在数据编修的时候,需要
传回修改以后的记录集的时候用得比较多。
   语法:
   
   Set Reco=Cnn.Execute(命令文字,影响记录的笔数,选择)
  “影响记录的笔数”指的是执行Execute方法以后,数据库被修改的
        笔数,对SELECT 该数值无效。
  “选择”指的是“命令文字”的意义,说明如下:
  adCmdText    数据源将传入的“文字定义”视为命令文字,
       比如SQL 语句。
  adCmdTable    数据源将传入的“文字定义”视为表名称。
  adCmdStoredProc 数据源将传入的“文字定义”视为存储过程,
       适用于SQL Server。
  adCmdUnknown  数据源不知道“文字定义”的类型,将自动
       检测,可以是SQL 语句,但是自动监测将会降低
       效率,此为默认值。

  2)用Recordset的Open方法
   语法
   Reco.Open SQL语句,Cnn,指针形态,锁定方式
---------------------------------------------------------------
  做一个数据查询的Frame,打开表的时候让frame2.visible=true
放入一个Textbox(Text3)为写入SQL 语言用,一个按钮执行查询,
另一个按钮用于把当前表的名字加入。
---------------------------------------------------------------
  Private Sub Command9_Click()
   If Kzc Then
    Reco.Close
    Reco.Open Text2.Text, Cnn, 3
   ElseIf kzc1 Then
    Reco.Close
    Reco.Open Text2.Text, Cnn1, 3
   ElseIf kzc2 Then
    Reco.Close
    Reco.Open Text2.Text, Cnn2, 3
   End If

  End Sub
  Private Sub Command12_Click()
   Text2.SelText = Tname +
   Text2.SetFocus
  End Sub
  Private Sub Command9_Click()
  If Kzc Then
   Reco.Close
   Reco.Open Text3.Text, Cnn, 3, 3
  ElseIf kzc1 Then
   Reco.Close
   Reco.Open Text3.Text, Cnn1, 3, 3
  ElseIf kzc2 Then
   Reco.Close
   Reco.Open Text3.Text, Cnn2, 3, 3
  End If
Showfiel
End Sub

---------------------------------------------------------------
  八、Recordset查询和过滤
   
    Reco.Find 条件
   把指针定位在符合条件的记录上
    Reco.filter = 条件
   只显示符合条件的记录,注意,筛选掉的数据并没有删除,只是
暂时隐蔽,一旦筛选条件移除,又自动恢复原状,筛选移除的方法:
   
   Reco.filter =
  由于条件是文本的形式,所以构造条件相当的方便。条件表达式除
了>、>=、、 AND、 OR、 NOT、 XOR以外,更有一种Like ,
用于处理文字类型,使用统配符(*或%),可以实现部分匹配查询。
  注意两点:
  第一点是查询表达式需要用引号时,要改成单引号。
  第二点是统配符必须在结尾存在:
  比如:  
  客户名称 LIKE '龙*' 或 客户名称 LIKE '*龙*' 是正确的。
  而 客户名称 LIKE '龙*' 是错误的。
  
  虽然SQL 和Recordset可能有相似的查询功能,但本质是不同的,
SQL是在服务器端处理,把查询的结果传入,所以更适合构造数据集。
而Recordset查询是在客户端,并不影响数据集的本身,所以速度更快,
也更加精细,所更适合做精细的数据处理。
------------------------------------------------------------
在实验程序中增加功能
------------------------------------------------------------
'Find查询
Private Sub Command8_Click()
Reco.Find Text2.Text
If Reco.EOF() Then
   MsgBox 没有这个数据
   Reco.MoveFirst
  End If
Showfiel
End Sub
'下一个
Private Sub Command8_Click()
Reco.Find Text2.Text
If Reco.EOF() Then
   MsgBox 没有这个数据
   Reco.MoveFirst
  End If
Showfiel
End Sub
'过滤
Private Sub Command16_Click()
Reco.Filter = Text2.Text
Showfiel
End Sub
------------------------------------------------------------
  九、分页
    设置每页为N 笔
    Reco.PageSize=N
   
    总页数为N
    N=Reco.PageCount
   
    设定记录指针指向的页数
    Reco.AbsolutePage=N
    取得指针指向的页数
    N=Reco.AbsolutePage
    例:输出某页中的记录:
    Reco.AbsolutePage=2
    for i=1 to Reco.pagesize
       if Reco.Eof then
          Exit for
       end if
      -----处理---------
    Next
        
  十、Recordst属性Bof和Eof
   分别指示指针指向头以前和尾以后。
   结果为true和false
----------------------------------------------------------------
  下面我们设法让构造查询条件变得更方便。
  加入两个List和一个Combo1,list1的style属性选1-Checkbox为
多选型list2的list属性加入常用的SQL命令单词,再加入一个“字段
送出按钮”。
  Myscreen子程序增加一些List和ComboBox处理的程序,在打开
数据库时,把相应字段名显示出来,便于组织条件的时候使用。
  所以要加入一个新的过程MyscreenSQL,是因为查询以后可能字段
数目要发生变化,ComboBox要显示新的字段值,但List却希望显示原
来的字段值,便于重新组织查询。

----------------------------------------------------------------
'给Myscreen增加相应的语句
Private Sub Myscreen()
Nd = Reco.Fields.Count
If Nd >= 9 Then
  Nd = 9
End If
  
For i = 0 To 8
  Label1(i).Visible = False
  Text1(i).Visible = False
Next
  
For i = 0 To Nd - 1
  Label1(i).Caption = Reco.Fields(i).Name
  Label1(i).Visible = True
  Text1(i).Visible = True
Next
  Reco.MoveFirst
  Label2.Visible = False
  
List1.Clear
Combo1.Clear

For i = 0 To Reco.Fields.Count - 1
  List1.AddItem Reco.Fields(i).Name
  Combo1.AddItem Reco.Fields(i).Name
Next
  Combo1.Text = Combo1.List(0)  
Frame2.Visible = True
End Sub

'做一个MyscreenSQL过程,为SQL语言发送用
Private Sub MyscreenSQL()
Nd = Reco.Fields.Count
If Nd >= 9 Then
  Nd = 9
End If
  
For i = 0 To 8
  Label1(i).Visible = False
  Text1(i).Visible = False
Next
  
For i = 0 To Nd - 1
  Label1(i).Caption = Reco.Fields(i).Name
  Label1(i).Visible = True
  Text1(i).Visible = True
Next
  Reco.MoveFirst
  
Combo1.Clear

For i = 0 To Reco.Fields.Count - 1
  Combo1.AddItem Reco.Fields(i).Name
Next
  Combo1.Text = Combo1.List(0)
  
End Sub
'送出字段名
Private Sub Combo1_Click()
Text2.SelText = Combo1.Text
Text2.SetFocus
End Sub
'送出选中的字段列表
Private Sub Command10_Click()

Dim i, st
'List1.Selected(i) = True为选中
st =
For i = 0 To List1.ListCount - 1
  If List1.Selected(i) = True Then
   If st = Then
    st = List1.List(i)
    Else
    st = st + , + List1.List(i)
   End If
  End If
Next
Text2.SelText = st +
Text2.SetFocus
End Sub
'双击list2送出选中的SQL命令
Private Sub List2_DblClick()
Text2.SelText = List2.Text +
Text2.SetFocus
End Sub
---------------------------------------------------------------     

  好啦,一个完整的数据库处理程序完成了,最后注意,退出程序,
在VB 6.0中是 Unload Me,相应的,在VB.Net 变成了Application.Exit()。
怎么样,很有意思吧?
   
  十一、ADO 的Command对象
  Command对象主要用于查询数据库,并返回Recordset对象中的记录。
  常用属性:
  1)CommandText:
  设置返回命令,包括SQL,表格,存储过程。
  如果是SQL 语句,CommandText的后面要跟上Execute方法。
  例如:
  
  Cmm.CommandText=SQL 语句
  Cmm.Execute
  2)CommandType属性:
  指示如何计算CommandText的值,主要有如下几种选择:
  adCmdText    数据源将传入的“文字定义”视为命令文字,
       比如SQL 语句。
  adCmdTable    数据源将传入的“文字定义”视为表名称。
  adCmdStoredProc 数据源将传入的“文字定义”视为存储过程,
       适用于SQL Server。
  adCmdUnknown  数据源不知道“文字定义”的类型,将自动
       检测,可以是SQL 语句,但是自动监测将会降低
       效率,此为默认值。
  这个属性在很多地方需要设置。
   
   十二、实例:用户名和密码申请机制


      第四节  ADODC 控件
  ADODC 是VB提供的一个基于ADO 模型的控件,调用它需要:
工程-〉部件-〉MS ADO Data Control 6.0(OLEDB)。
  一、连接数据源:
  属性:
  Connectionstring
    1,使用ODBC数据源:如果有可以选择,如没有可以新建,新
  建的方法与在Windows下一样。
   选择好数据源以后,应该能看到:
   Connectionstring=DSN=***
    2, 使用连接字符串:连接字符串包括了驱动程序, 可以利
   用文件名调用,完成后要注意测试一下连接。
      从效果上看,和数据源是一样的,但可以避免每台客户机
   上重复设置。
  CommandType属性,最好根据要求设置。
  
  连接“表”或者初始的SQL 语言:
  属性:
  RecordSource
  对话框中出现“命令类型”,实际上就是设置CommandType属性,
最好根据要求选择:
  用SQL 用  1-adCmdText
  用表名用  2-adCmdTable
  存储过程用 4-adCmdStoredProc
  不清楚用  8-adCmdUnknown
  输入表名或SQL 语句,就完成了数据源联接的设置。
  
  (提示,在直接使用ADO 的时候,如果对 Connectionstring参数
或其它项目没把握。可以先用ADODC设置,成功后再把相应的字符串拷
贝过去)。
  ADODC 内置了Recordset对象,所有Recordset对象的属性和方法,
都可以采用,指令格式为:
  ADODC1.Recordset.属性或者方法
  
  也就是说,上面所研究的关于ADO 的Recordset对象的一切属性和
方法,都可以直接在这里使用,因此就不再重复了。
  值得提出的是SQL 的使用方法:
   Adodc1.RecordSource=SQL
   Adodc1.Refresh  '没有此句不反应   

  二、数据绑定控件
  使用ADODC 的最大的好处是,可以方便的使用数据绑定控件,这
里先介绍两种:
  1)表(Datagrid)
  MS Datagrid Control 6.0
  属性
  DataSource=Adodc1
  2)TextBox
  属性
  DataSource=Adodc1
  Datafilds=字段
  实例:SQL自由查询

   第五节 数据环境DataEnvironment
  一、建立数据连接
  在工程管理器中,右键 -〉添加 -〉Data Environment
  这就产生了一个数据环境窗口DataEnvironment1。下面出现了一
个Connection图标,用以实现和数据库的连接。
  在Connection1上右键 -〉属性 ,用ADO 同样的方法进行数据库
的连接。
  完成以后,Connection1的ConnectionSource是连接字符串,也
可以在运行期改变连接。  
  具体方法是:
  
  DataEnvironment1.Connection1.ConnectionString=连接字符串
  二、添加命令(与表的连接):
  在Connection1上右键 -〉添加命令
  就产生了一个Command1
  右键,就出现了一个对话框:
  通用-〉数据源 -〉可以选 SQL、表、存储过程
  例如这里选“表”,选择表名,确认。
  在Command1的属性:CommandType 可以改变设置,而CommandText
可以改变“表”或者SQL 命令的文字。
  点Command1的加号,可以看到字段名字。
  三、添加数据库的关联
  如果需要添加数据库的关联,可以在Command1上右键 -〉添加子
命令。
  于是在Command1下出现了一个Command2
  在Command2上右键 -〉属性
  进行表的连接。
  
  打开“关联”选项卡,选择关联字段,添加。这就实现了两个表
的关联。
  四、数据库显示
  Command1左键拖入窗体,就实现了数据库的显示(左键为Textbox,
右键为DataGrid)
  如果是自定义的显示控件(例如DataGrid):
  属性:
   DataSource=DataEnvironment1
   DataMember=Command1 或 Command2
   
  五、Recordset命令
  如果希望使用Recordset命令,注意在DataEnvironment1下有一个
ReCommand1(其中的Command1是根据Command1的名字自动给出的),相
当于ADO的Recordset,可以使用Recordset命令集。
  这样,我们就可以方便的应用数据库了。
  
  在熟悉了ADO 以后,DataEnvironment数据环境可以使我们设计
数据库系统更加方便快捷。
回复

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2025-4-30 01:29 , Processed in 0.082296 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表