分享

第6章 查询SQL Server数据库概述

2011-11-16  昵称380475

6 查询SQL Server数据库概述

本章介绍如何查询获取SQL Server数据库数据,并将查询结果复制到Excel工作表中;以及如何将Excel工作表的数据保存到SQL Server数据库。

6.1 SQL查询语言概述

SQL查询语言是进行数据库查询的重要工具。利用SQL语言,不仅可以对数据库进行各种操作(正如前面各章所介绍的那样),而且还可以对数据库进行数据查询。

6.1.1 SELECT查询语句的语法结构

在众多的SQL语句中,SELECT语句是使用最频繁的。SELECT语句主要被用来对数据库进行查询并返回符合用户查询标准的结果数据。

SELECT语句有五个主要的子句,而FROM是唯一必需的子句。每一个子句有大量的选择项和参数等。SELECT语句的语法格式如下:

SELECT 字段列表

     FROM 子句

            [WHERE 子句]

            [GROUT BY 子句]

            [HAVING 子句]

            [ORDER 子句]

SELECT语句的各项组成说明如下。

1、字段列表

字段列表指定多个字段名称,各个字段之间用逗号“,”分隔。用星号“*”代替具体的字段可以表示所有的字段;当包含有多个表的字段时,可用“数据表名.字段名”来表示,即在字段名前明示该字段所在的数据表。

2FROM子句

FROM子句是一个必需子句,指定要查询的数据表,各个数据表之间用逗号“,”分隔。

3WHERE子句

是一个可选子句,指定要查询的条件,可以使用SQL运算符组成各种条件运算表达式。

如果条件值是数值,则直接写上数值,如“WHERE年龄>50;如果条件值是字符串或日期,则必须用单引号“‘”括起来,如“WHERE 姓名=’李辉‘,“HWERE 日期>’2007-10-22”。

4GROUP BY子句

是一个可选子句,指定分组项目,使具有同样内容的记录(例如日期相同、部门相同、性别相同等)归类在一起。

5HAVING子句

是一个可选子句,功能与WHERE子句类似,只是必须与GROUP BY子句一起运行。

6ORDER BY子句

是一个可选子句,指定查询结果以何种方式排序。排序方式有两种:升序(ASC)和降序(DESC)。如果省略ASCDESC,就表示按升序排序。

6.1.2 SQL查询语言的有关函数

SQL查询语言中,有很多函数可以使用,比如字符串函数、数学函数、日期和时间函数、私聚合函数等。关于这些函数的详细情况,请参阅有关的SQL书籍或者TransactSQL书籍。

6.2 将查询结果复制到Excel工作表

当我们从SQL Server数据库中查询到满足条件的纪录后,就可以将这些纪录数据复制到Excel工作表,或者通过VBA窗体显示出来。下面我们结合实例介绍将查询结果复制到Excel工作表的具体方法和程序代码。

6.2.1 利用Range对象的CopyFromRecordset方法复制查询结果

将查询纪录数据复制到Excel工作表有两种基本方法:利用Rage对象的CopyFromRecordset方法和利用循环的方法。下面我们首先介绍利用Rage对象的CopyFromRecordset方法复制查询结果的具体方法和步骤。

利用Rage对象的CopyFromRecordset方法复制查询结果,只能复制查询记录集的具体各条记录,不能复制各条记录的字段名。如果要复制字段名,则需要使用Field对象的Name属性。

【例6-1】下面的例子是利用Range对象的CopyFromRecordset方法,将SQL Server数据库服务器(名称为“”)上数据库“Northwind”中的数据表“Customers”的所有记录复制到工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库Microsoft Active Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 LibraryMicrosoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 61()

   Dim cnn As New ADODB.Connection

   Dim rs As New ADODB.Recordset

   Dim ws As Worksheet

   Dim SQL As String, mydata As String, mytable As String

   Dim i As Long, j As Long

   Set ws = ThisWorkbook.ActiveSheet        '指定要复制查询数据的工作表

   ws.Cells.Clear                           '清除工作表的所有数据

   mydata = "NorthWind"       '指定数据库

   mytable = "Custoners"      '指定数据表

   '建立与SQL Server数据库服务器上指定数据库的连接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '执行SQL语句创建指定数据表的查询记录集

    SQL = "select * from" & mytable

    Set rs = cnn.Execute(SQL)

    '复制字段名

    For i = 0 To rs.Fields.Count - 1

        ws.Cells(1, i + 1) = rs.Fields(i).Name

        ws.Cells(1, i + 1).Font.Bold = True

    Next i

    '复制全部记录数据

    ws.Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

    ws.Columns.AutoFit

    '关机记录集以及与数据库的连接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

    Set ws = Nothing

End Sub

下面对这个程序进行分析:

1)首先利用语句“Set ws=工作表名”指定要保存查询记录的工作表,这里我们要把查询数据保存在当前程序代码运行工作簿的活动工作表中,即:

Set ws=ThisWorkbook.ActiveSheet

2)为了防止在复制新的查询记录时,工作表还残留上次查询记录数据,因此在程序中首先使用语句“ws.Cells.Clear”清除指定工作表的所有数据。

3)第3步是指定要查询的数据库和数据表。

4)第4步是建立与数据库的连接。

5)步5步是创建一个全表查询记录集,即:

SQL = select*from” & mytable

Set rs = cnn.Execute(SQL)

由于是创建全表查询记录集,因此还可以使用下面的语句:

Set rs = cnn.Execute(mytable)

6)6步是复制查询记录集的字段名,方法是循环Fields集合,利用Field对象的Name对象获取字段名称。但需注意的是,引用各个字段时使用rw.Fields(0),第2个字段是rw.Fields(1),第3个字段是rw.Fields(2),依此类推,最后一个字段是rs.Fields(rs.Fields.Count-1)。字段总数用rs.Fields.Count计算。

7)第7步是利用Range对象的CopyFromRecordset方法将查询结果复制到以指定单元格为左上角单元格的单元格区域,即:

ws.Range(“A2”).CopyFromRecordset rs

8)为了能够使复制到工作表的数据清晰易查看,最后使用语句“ws.Columns.AutoFit”对工作表的所有列进行设置,使之自动调整为最合适的宽度。

6.2.2 利用循环的方法复制查询结果

利用循环的方法复制查询结果,就是循环查询记录集的各条记录,并将各条记录的全部数据复制到工作表。由于是循环查询记录集的各条记录,因此这种方法要慢得多,尤其数据量很大时更是如此。此外,当记录集中某个字段是数字型文本数据时,采用循环的方法将该字段数据复制到工作表,会自动将该字段数据转换为数字,因此,如果该字段数据的前面有0,那么就会被忽略掉,这点要特别注意。

【例6-2】下面的例子是将SQL Server数据库服务器(名称为“”)上数据库“Northwind”中的数据表“EmployeeTerritories”的所有记录复制到工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库Microsoft Active Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 LibraryMicrosoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 62()

   Dim cnn As New ADODB.Connection

   Dim rs As New ADODB.Recordset

   Dim ws As Worksheet

   Dim SQL As String, mydata As String, mytable As String

   Dim i As Long, j As Long

   Set ws = ThisWorkbook.ActiveSheet        '指定要复制查询数据的工作表

   ws.Cells.Clear                           '清除工作表的所有数据

   '指定数据库和数据表

   mydata = "NorthWind"       '指定数据库

   mytable = "Custoners"      '指定数据表

   '建立与SQL Server数据库服务器上指定数据库的连接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '执行SQL语句创建指定数据表的查询记录集

    SQL = "select * from" & mytable

    Set rs = cnn.Execute(SQL)

    '复制字段名

    For i = 0 To rs.Fields.Count - 1

        ws.Cells(1, i + 1) = rs.Fields(i).Name

        ws.Cells(1, i + 1).Font.Bold = True

    Next i

    '复制全部记录数据

    i = 1

    Do While Not rs.EOF

        For j = 0 To rs.Fields.Count - 1

            ws.Cells(i + 1, j + 1) = rs.Fields(j).Value

        Next j

        rs.MoveNext

        i = i + 1

    Loop

    '字段设置列宽至合适的宽度

    ws.Columns.AutoFit

    '关机记录集以及与数据库的连接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

    Set ws = Nothing

End Sub

这个程序的前面部分与【例6-1】完全相同,唯一不同的是复制记录集数据的语句部分。这里要注意的是,每复制完毕一条记录后,要使用语句“rs.MoveNext”将记录指针移到下一条记录上。

6-1为该数据表的原始数据。图6-2为复制到工作表的记录数据。比较两个图中的TerritoryID字段数据,可以看到,凡是前面有0的数据,0都忽略了,并且数据被转换为数字了。

为了克服这个缺点,我们需要对字段的数据类型进行判断,并对数字类型的字段数据进行文本化处理,有关的程序代码修改如下,请仔细注意程序中判断字段数据类型的语句,判断字段数据类型要使用Field对象的Type属性,而文本型数据有很多种,因此要全部列出:

Do While Not rs.EOF

   For j = 0 To rs.Fields.Count - 1

       '判断该字段是否文本数据,如果是,就将该单元格设置为文本格式

       If rs.Fields(j).Type = adChsr Or rs.Fields(j).Type = adLongVarChar _

       Or rs.Fields(j).Type = adLongVarWChar Or rs.Fields(j).Type = adVarChar _

       Or rs.Fields(j).Type = adVarWChar Or rs.Fields(j).Type = adWChar Then

           ws.Cells(i + 1, j + 1).NumberFormatLocal = "&"

        End If

        ws.Cells(i + 1, j + 1) = rs.Fields(j).Value

    Next j

    rs.MoveNext

    i = i + 1

Loop

运行修改后的程序代码,可以得到如图6-3所示的数据。

在利用循环方式复制查询记录时,依据创建查询记录集方式的不同,复制数据时可以不同的方法。前面介绍的创建记录集的方法是利用ADOConnection对象的Execute方法,这种方法创建的记录集无法直接得到记录集中的记录总数,因此只能利用Do……Loop循环语句复制数据。

如果我们使用Recordset对象的Open方法创建记录集,只要正确设置Open方法的游标类型和锁定类型参数,就能够使用Recordset对象的RecordCount属性获取记录集的记录总数。下面的程序就是使用Recorset对象的Open方法创建记录集,并复制数据到工作表的程序代码:

Public Sub 622()

   Dim cnn As New ADODB.Connection

   Dim rs As New ADODB.Recordset

   Dim ws As Worksheet

   Dim SQL As String, mydata As String, mytable As String

   Dim i As Long, j As Long, n As Long

   Set ws = ThisWorkbook.ActiveSheet        '指定要复制查询数据的工作表

   ws.Cells.Clear                           '清除工作表的所有数据

   '指定数据库和数据表

   mydata = "NorthWind"       '指定数据库

   mytable = "Custoners"      '指定数据表

   '建立与SQL Server数据库服务器上指定数据库的连接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '执行SQL语句创建指定数据表的查询记录集

    SQL = "select * from" & mytable

    rs.Open SQL, cnn, adOpenKeyset, adLockOptimistic

    '获取记录总数

    n = rs.RecordCount

    '复制字段名

    For i = 0 To rs.Fields.Count - 1

        ws.Cells(1, i + 1) = rs.Fields(i).Name

        ws.Cells(1, i + 1).Font.Bold = True

    Next i

    '复制全部记录数据

    For i = 1 To n

        For j = 0 To rs.Fields.Count - 1

            '判断该字段是否文本数据,如果是,就将该单元格设置为文本格式

            If rs.Fields(j).Type = adChar Or rs.Fields(j).Type = adLongVarChar _

            Or rs.Fields(j).Type = adLongVarWChar Or rs.Fields(j).Type = adVarChar _

            Or rs.Fields(j).Type = adVarChar Or rs.Fields(j).Type = adWChar Then

                 ws.Cells(i + 1, j + 1).NumberFormatLocal = "&"

            End If

            ws.Cells(i + 1, j + 1) = rs.Fields(j).Value

        Next j

        rs.MoveNext

    Next i

    '字段设置列宽至合适的宽度

    ws.Columns.AutoFit

    '关机记录集以及与数据库的连接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

    Set ws = Nothing

End Sub

注意,为了能够使用Recordset对象的REcordCount属性获取记录集的记录总数,必须使用下面的语句创建查询记录集:

rs.Open SQL,cnn,adOpneKeyset,adLockOptimistic

6.2.3 对复制到工作表的查询结果进行规范处理

如果在数据库中对字段的数据类型定义为了Char等文本型数据类型,并指定了字段长度,但字段数据的实际长度并没有达到规定的字段长度,那么当将查询结果复制到工作表后,字段数据实际长度并没有达到规定的字段长度的那些字段记录数据后面会有一些空格,这样势必会影响我们利用Excel对数据进行分析,因此,必须将这些数据后面的空格去掉。

为了去掉这些数据后面的空格,可以使用Trim函数,并利用循环的方式复制查询出的记录。当然,也可以在利用Range对象的CopyFromRecordset方法将查询结果复制到工作表后,再利用工作簿函数TRIM对数据进行处理。不过,要想一劳永逸地解决问题,不如在查询并复制数据时就一次性地解决问题。

【例6-3】下面的例子将SQL Server数据库服务器(名称为“”)上数据库“Northwind”中的数据表“Customers”的所有记录复制到工作表,并去掉所有数据两边的空格。

在运行下面的程序之前,要确保已经引用了ADO对象库Microsoft Active Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 LibraryMicrosoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 63()

   Dim cnn As New ADODB.Connection

   Dim rs As New ADODB.Recordset

   Dim ws As Worksheet

   Dim SQL As String, mydata As String, mytable As String

   Dim i As Long, j As Long

   Set ws = ThisWorkbook.ActiveSheet        '指定要复制查询数据的工作表

   ws.Cells.Clear                           '清除工作表的所有数据

   '指定数据库和数据表

   mydata = "NorthWind"       '指定数据库

   mytable = "Custoners"      '指定数据表

   '建立与SQL Server数据库服务器上指定数据库的连接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '执行SQL语句创建指定数据表的查询记录集

    SQL = "select * from" & mytable

    Set rs = cnn.Execute(SQL)

    '复制字段名

    For i = 0 To rs.Fields.Count - 1

        ws.Cells(1, i + 1) = rs.Fields(i).Name

        ws.Cells(1, i + 1).Font.Bold = True

    Next i

    '复制全部记录数据

     i = 1

     Do While Not rs.EOF

        For j = 0 To rs.Fields.Count - 1

            ws.Cells(i + 1, j + 1) = Trim(rs.Fields(j).Value)

        Next j

        rs.MoveNext

        i = i + 1

    Loop

    '字段设置列宽至合适的宽度

    ws.Columns.AutoFit

    '关机记录集以及与数据库的连接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

    Set ws = Nothing

End Sub

6.3 将查询结果显示在窗体

6.3.1 将查询结果显示在窗体——利用ListView控件

我们可以通过窗体显示、编辑数据库数据,从而使得数据的浏览和编辑更加方便和直观。但是,这种通过窗体浏览、编辑数据库数据有一个缺点,就是设计好的窗体仅能使用一个固定的数据库,当数据库更换后,由于数据库的字段数目也改为了,就需要重新设计窗体结构了。

不过,如果仅仅是通过窗体浏览数据库数据,而不涉及数据库数据的编辑问题,那么我们可以利用TreeView控件、ListView控件、列表框、组合框等来显示数据库数据。

【例6-4】下面的例子是利用列表框ListView控件浏览SQL Server数据库服务器(名称为“”)上所有数据库数据。

在运行下面的程序之前,要确保已经引用了ADO对象库Microsoft Active Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 LibraryMicrosoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

1、窗体结构设计

窗体结构如图6-4所示。该窗体的名称属性和Caption属性都设置为“数据库记录浏览”。

在窗体上插入3个框架Frame1Frame2Frame3,其Caption属性分别设置为“数据库”、“数据表”和“数据表记录浏览”。

在框架Frame1内插入1个列表框,其名称为ListBox1,用于显示在SQL Server数据库服务器上所有数据库名称。

在框架Frame2内插入1个列表框,其名称为ListBox2,用于显示选择的某个数据库中所有的数据表名称。

在框架Frame3内插入1ListView控件,其名称为ListView1,用于显示某个数据表中的全部记录数据。

在窗体的右下角插入一个命令按钮,其名称属性和Caption属性均设置为“关闭”,Cancel属性设置为True

2、程序代码设计

1)为用户窗体设置Initialize事件,当启动窗体时,建立与SQL Server数据库服务器的连接,查询获取服务器上所有的数据库名称,并显示在列表框ListBox1中。程序代码如下:

Private Sub UserForm_Initialize()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim SQL As String

    Dim i As Long

    '建立与SQL Server数据库服务器的连接

    cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER"

    cnn.Open

    '获取SQL Server数据库服务器上所有的数据库名,并设置ListBox1控件

    SQL = "select name from sysdatabases"

    rs.Open SQL, cnn, adOpenKeyset, adLockOptimistic

    '设置ListBox1控件的项目

    With ListBox1

        .Clear

        For i = 1 To rs.RecordCount

            .AddItem rs.Fields(0).Value

            rs.MoveNext

        Next i

        .ListStyle = fmListStyleOption

    End With

    '关闭记录集和断开数据库连接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

2)为列表框ListBox1设置Click事件,当单击某个数据库时,就查询该数据库内的所有数据表名称,并显示在列表框ListBox2中。程序代码如下:

Private Sub ListBox1_Click()

    On Error Resume Next

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim i As Integer

    '显示选择的数据库标题

    Frame3.Caption = Trim(ListBox1.Text) & "库记录"

    '清除ListView1控件的标题和数据

    ListView1.ColumnHeaders.Clear

    ListView1.ListItems.Clear

    '建立与SQL Server数据库服务器上某个数据库的连接

    cnn.ConnectionString = "Provider=SQLOLEDB.1;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & Trim(ListBox1.Text)

    cnn.Open

    '查询选定数据库内的所有数据表

    SQL = "select name from sysobjects where xtype='U'"

    rs.Open SQL, cnn, adOpenKeyset, adLockOptimistic

    '设置ListBox1控件的项目

    With listbox2

        .Clear

        For i = 1 To rs.RecordCount

            .AddItem rs.Fields(0).Value

            rs.MoveNext

        Next i

        .ListStyle = fmListStyleOption

    End With

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

3)为列表框ListBox2设置Click事件,当单击某个数据表时,就查询该数据表内的所有记录,并存ListView1控件中显示该数据表的全部记录数据。程序代码如下:

Private Sub ListBox2_Click()

     On Error Resume Next

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim i As Integer

    Dim item As Listitem

    '显示选择的数据表标题

    Frame3.Caption = Trim(ListBox1.Text) & " 数据库 " & Trim(ListBox2.Text) & " 表的所有记录"

    '清除ListView1控件的标题和数据

    ListView1.ColumnHeaders.Clear

    ListView1.ListItems.Clear

    '建立与SQL Server数据库服务器上某个数据库的连接

    cnnStr = "Provider=SQLOLEDB.1;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & Trim(ListBox1.Text)

    cnn.ConnectionString = cnnStr

    cnn.Open

    '查询选定数据表

    Set rs = New ADODB.Recordset

    rs.Open Trim(ListBox2.Text), cnn, adOpenDynamic, adLockOptimistic

    '设置ListView1的有关属性

    With ListView1

         .View = lvwReport      '以报表形式显示数据

         .FullRowSelect = True  '选择整行

         .Gridlines = True      '显示网格线

    End With

    'ListView1控件设置标题

    For i = 1 To rs.Fields.Count - 1

        ListView1.ColumnHeaders.Add , , rs.Fields(i).Name

    Next i

    'ListView1控件中显示选择数据表的全部记录数据

    If rs.BOF And rs.EOF Then Exit Sub

    Do While Not rs.EOF

        If Not IsNull(rs.Fields(0)) Then

            Set item = ListView1.ListItems.Add(, , rs.Fields(0))

            For i = 1 To rs.Fields.Count - 1

                If Not IsNull(rs.Fields(i)) Then

                    item.SubItems(i) = rs.Fields(i)

                Else

                    item.SubItems(i) = ""

                End If

            Next i

        End If

        rs.MoveNext

    Loop

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

4)为【关闭】按钮设置Click事件,当单击此按钮时,就关闭窗体,程序代码如下:

Private Sub 关闭_Click()

     Unload 数据库记录浏览

End Sub

3、运行检验

1)启动窗体,如图6-5所示。

2)单击“数据库”列表框内的某个数据库名称,就在“数据表”列表框中显示该数据库内所有的数据表名称,如图6-6所示。

3)单击“数据表”列表框中的某个数据表名称,在窗体右边的ListView1控件中显示该数据表的全部记录数据,如图6-7所示。

6.3.2 将查询结果显示在窗体——利用浏览按钮

我们也可以通过窗体上的浏览按钮显示数据库数据,比如单击【第一条】按钮、【下一条】按钮、【上一条】按钮和【最末条】按钮,就分别查看第一条记录、下一条记录、上一条记录和最末条记录。

【例6-5】下面的例子是利用列表框和ListView控件浏览SQL Server数据库服务器(名称为“THTFCOMPUTER”)上所有数据库数据。

在运行下面的程序之前,要确保已经引用了ADO对象库Microsoft Active Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 LibraryMicrosoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

1、窗体结构设计

窗体结构如图6-8所示。该窗体的名称属性和Caption属性都设置为“订单管理”。

在窗体上插入1个框架Frame1,其Caption属性分别设置为“销售订单浏览”,但在运行过程中其Caption属性将不断变化。

在框架Frame1内插入12标签,其Caption属性分别设置如图6-8所示。

在框架Frame1内插入5个命令按钮,其名称分别为TextBox1TextBox2,……TextBox12

在窗体的右侧插入5个命令按钮,其名称属性和Caption属性均分别设置为“第一条”、“下一条”、“上一条”、“最末条”和“关闭”,其中“关闭”按钮的Cancel属性设置为True

2、程序代码设计

1)定义如下的模块级变量,他们放在窗体代码窗口的顶部:

Dim cnn As New ADODB.Connection

Dim rs As ADODB.Recordset

Dim mydata As String, mytable As String

2)为用户窗体设置Initialize事件,当启动窗体时,建立与SQL Server数据库服务器上“销售管理”数据库的连接,查询该数据库中“订单资料”数据表的全部记录,并在窗体上显示第一条记录数据。程序代码如下:

Private Sub UserForm_Initialize()

    '指定数据库和数据表

    mydata = "销售管理"     '指定数据库

    mytable = "订单资料"    '指定数据表

    '建立与SQL Server数据库服务器上指定数据库的连接

    cnnStr = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial catalog=" & mydata

    cnn.ConnectionString = cnnStr

    cnn.Open

    '查询选定的数据表

    Set rs = New ADODB.Recordset

    rs.Open mytable, cnn, adOpenKeyset, adLockOptimistic

    Call 查询订单信息

    Call 显示订单信息

    Frame1.Caption = "销售订单浏览:  共有" _

        & rs.RecordCount & " 条记录    目前是第   " _

        & rs.AbsolutePosition & "  条记录"

End Sub

3)为【第一条】按钮设置Click事件,当单击此按钮时,就显示数据库中第一个订单记录信息,程序代码如下:

Private Sub 第一条_Click()

    If rs.BOF And rs.EOF Then Exit Sub

    If rs.BOF Then Exit Sub

    rs.MoveFirst

    If rs.BOF Then Exit Sub

    Call 显示订单信息

End Sub

4)为【下一条】按钮设置Click事件,当单击此按钮时,就显示数据库中下一个订单记录信息,程序代码如下:

Private Sub 下一条_Click()

    If rs.BOF And rs.EOF Then Exit Sub

    If rs.EOF Then Exit Sub

    rs.MoveNext

    If rs.EOF Then Exit Sub

    Call 显示订单信息

End Sub

5)为【上一条】按钮设置Click事件,当单击此按钮时,就显示数据库中上一个订单记录信息,程序代码如下:

Private Sub 上一条_Click()

    If rs.BOF And rs.EOF Then Exit Sub

    If rs.BOF Then Exit Sub

    rs.MovePrevious

    If rs.BOF Then Exit Sub

    Call 显示订单信息

End Sub

6)为【最末条】按钮设置Click事件,当单击此按钮时,就显示数据库中最末一个订单记录信息,程序代码如下:

Private Sub 最末条_Click()

     If rs.BOF And rs.EOF Then Exit Sub

     If rs.EOF Then Exit Sub

     rs.MoveLast

     If rs.EOF Then Exit Sub

     Call 显示订单信息

End Sub

7)为【退出】按钮设置Click事件,当单击此按钮时,就关闭订单信息浏览主窗体,程序代码如下:

Private Sub 退出_Click()

    Unload 订单管理

End Sub

8)两个子程序的程序代码

“查询订单信息”的功能是查询数据库中所有订单的记录信息,程序代码如下:

Public Sub 查询订单信息()

    SQL = "select * from" & mytable & " order by 订单号"

    Set rs = New ADODB.Recordset

    rs.Open SQL, cnn, adOpenKeyset, adLockOptimistic

End Sub

子程序“显示订单信息”的功能是将某个订单的记录信息显示在窗体上的文字框中,程序代码如下:

Private Sub 显示订单信息()

    Dim i As Integer

    For i = 1 To 12

        If IsNull(rs.Fields(i - 1)) Then

            Me.Controls("TextBox" & i).Value = ""

        Else

            Me.Controls("TextBox" & i).Value = rs.Fields(i - 1).Value

        End If

    Next i

    Frame1.Caption = "销售订单浏览:  共有" _

         & rs.RecordCount & "  条记录   目前是第 " _

         & rs.AbsolutePosition & "  条记录"

End Sub

3、运行检验

1)启动窗体,如图6-9所示。

2)单击窗体上的【第一条】按钮、【下一条】按钮、【上一条】按钮和【最末条】按钮,就可以分别浏览第一条记录、下一条记录、上一条记录和最末条记录,如图6-10所示。

这种窗体结构可以方面我们对数据库数据进行编辑,比如在窗体上增加一个“添加”、“修改”和“删除”按钮,就可以添加、修改和删除记录;增加一个“查询”按钮,就可以打开一个查询窗体,进行记录查询并显示在窗体上。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 全屏 打印 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多