mob健身官网:第3章 获取SQL Server数据库信息

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 17:06:39

3 获取SQLServer数据库信息

为了能够正确地操作SQL Server数据库,我们首先需要了解数据库的有关信息,比如是否存在要操作的数据库和数据表;在数据表中是否存在某字段、字段的数据类型和他要多少;SQL Server服务器上有哪些数据库,在某个数据库中有哪些数据表,在数据表中有哪些字段,字段的名称、数据类型、字段长度是什么等。

3.1 建立与SQL Server服务器的连接

利用ADO建立与SQL Server服务器的连接的字符串一般形式如下:

cnnStr = “Provider = SQLOLEDB;” _

     & “User ID = sa;” _

     & “Password = 密码;” _

     & “Data Source = SQL Sever服务器名称”

这里,SQLOLEDB表示数据库类型为SQLServer;User ID指定访问数据库的用户名;Password指定打开数据库的密码,如果没有密码,可忽略此参数;Data Source指定数据库服务器名称或IP地址。

【例3-1】下面的例子是使用ADO的Connection对象的Open方法建立与SQL Server数据库服务器的连接。这里,SQLServer数据库服务器的名称为“THT

FCOMPUTER”。

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

Public Sub 例3_1()

   Dim cnn As New ADODB.Connection

   Dim cnnstr As String

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

   cnnstr = "provider=SQLOLEDB;User ID=sa:Password=11111;datasource=THTFCOMPUTER"

   cnn.connectonstring = cnnstr

   On Error Resume Next

   cnn.Open

   On Error GoTo 0

    '判断数据库服务器连接是否成功

   If cnn.State = adstateopen Then

       MsgBox "数据库服务器连接成功!", vbInformation, "连接服务器"

   Else

       MsgBox "数据库服务器连接失败!", vbInformation, "连接服务器"

   End If

   Set cnn = Nothing

End Sub

3.2 建立与SQLServer数据库的连接

利用ADO建立与SQL Server数据库服务器上指定数据库的连接的字符串一般形式如下:

cnnStr = “Provider = SQLOLEDB;” _

    & “User ID = sa;” _

    & “Password = 密码;” _

    & “Data Source =SQL Server服务器名称;” _

    & “Initial Catalog = 数据库名”

这里,SQLOLEDB表示数据库类型为SQLServer;User ID指定高谈阔论数据库的用户名;Password指定打开数据库的密码,如果没有密码,可忽略此参数;Data Source指定数据库服务器名称或IP地址;Initial Catalog指定要访问的数据库名。

【例3-2】下面的例子是使用ADO的Connection对象的Open方法建立与SQL Server数据库服务器上数据库“NorthWind”的连接。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—2()

   Dim cnn As New ADODB.Connection

   Dim cnnStr As String, mydata As String

   mydata = "northwind"   '指定数据库名称

    '设置建立与SQL Sever数据库服务器中指定数据库连接的字符串

   cnnStr = "Provider=SQLOLEDB;" _

         & "User ID=sa;" _

         & "Password = 11111;" _

         & "Data source=THTFCOMPUTER;" _

         & "Initial Catalog=" & mydata

   cnn.ConnectionString = cnnStr

    '试图打开指定的数据库

   On Error Resume Next

   cnn.Open

   On Error GoTo 0

    '判断数据库连接是否成功

   If cnn.State = adstateopen Then

       MsgBox "数据库连接成功!", vbInformation, "连接数据库"

   Else

       MsgBox "数据库连接失败!", vbInformation, "连接数据库"

   End If

   Set cnn = Nothing

End Sub

3.3 判断数据库是否存在

当我们要通过Excel自动在SQL Server数据库服务器上创建一个新的数据库时,如果在服务器中已经存在了一个同名的数据库,那么就会出现错误。因此,在创建数据库之前,首先要判断在SQL Server数据库服务器上是否存在着与要创建的数据库同名的数据库。

有很多方法可以判断在SQL Server数据库服务器上是否存在指定名称的某个数据库。例如,可以通过连接数据库的方法进行判断,如果连接成功就表明该数据库在在;可以试图创建数据库,如果出现错误就表明该名称的数据库存在。但是,最简单有效的方法是利用SQL语句创建一个SQLServer数据库名称的查询记录集,然后再循环这个查询记录集中的每个记录,查看是否存在指定名称的数据库。

3.3.1 利用SQL语句判断数据库是否存在

利用SQL语句创建一个SQL Server数据库名称的查询记录集的SQL语句如下:

SQL = “select name from sysdatabases”

【例3-3】下面的例子就是利用SQL语句判断在SQLServer数据库是否存在指定名称的数据库。这里,SQL Server数据库服务器的名称为“THTFCOMPUT

ER”。

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

Public Sub 例3_3()

   Dim cnn As New ADODB.Connection

   Dim rs As New ADODB.Recordset

   Dim cnnStr As String, SQL As String, mydata As String

   mydata = "NorthWind"    '指定数据库名称

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

   cnnStr = "provider=SQLOLEDB;" _

        & "User ID =sa;" _

        & "Password=11111;" _

        & "Data Source=THTFCOMPUTER"

   cnn.ConnectionString = cnnStr

   cnn.Open

    '执行sql语句创建数据库名称的记录集

   SQL = "select name from sysdatabases"

   Set rs = cnn.Execute(SQL)

    '判断指定名称的数据库是否存在

   Do While Not rs.EOF

       If LCase(rs.Fields("name")) = LCase(mydata) Then

           MsgBox "数据库<" & mydata & ">存在!", vbInformation

           Exit Sub

       End If

       rs.MoveNext

    Loop

   MsgBox "数据库不存在!", vbCritical

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

End Sub

我们可以将上述的程序做成一个自定义函数,以便于任何一个程序都可以使用它。下面的自定义函数DatebaseExist就是判断SQLServer服务器上是否存在指定名称的数据库,该函数的返回值为True或False,True表示数据库存在,False表示数据库不存在。该函数的两个必需参数cnn和myDatabase分别表示ADO的Connetion对象变量和指定名称数据库的名称字符串。

Public Function DatebaseExist(cnn AsADODB.Connection, myDatabase As String) As Boolean

   DatebaseExist = False

   Dim rs As New ADODB.Recordset

   Set rs = cnn.Execute("select name from sysdatabases")

    '判断指定名称的数据库是否存在

   Do While Not rs.EOF

      If LCase(rs.Fields("name")) = LCase(myDatabase) Then

          DatebaseExist = True

          Exit Function

      End If

      rs.MoveNext

    Loop

   rs.Close

   Set rs = Nothing

End Function

这样,在主程序中调用这个自定义函数的方法如下:

Public Sub 例3—3—1()

   Dim cnn As New ADODB.Connection

   Dim cnnStr As String, mydata As String

   mydata = "NorthWind"   '指定数据库名称

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

   cnnStr = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "Password=11111;" _

       & "Data Source=THTFCOMPUTER"

   cnn.ConnectionString = cnnStr

   cnn.Open

   If DatebaseExist(cnn, mydata) = True Then

       MsgBox "数据库<" & mydata & ">存在!", vbInformation

   Else

       MsgBox "数据库不存在!", vbCritical

   End If

   cnn.Close

   Set cnn = Nothing

End Sub

3.3.2 利用存储过程判断数据库是否存在

我们还可以利用存储过程sp_helpdb来判断数据库是否存在。此时,用存储过程sp_helpdb判断数据库是否存在的SQL语句如下:

SQL = “sp_helpdb 要查找的数据库名”

【例3-4】下面的例子就是利用存储过程判断在SQL Server数据库是否存在指定名称的数据库。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—4()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

   Dim mydata As String, SQL As String

   mydata = "NorthWind"   '指定数据库名称

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

   Set cnn = New ADODB.Connection

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "Password=11111;" _

       & "Data Source=THTFCOMPUTER"

   cnn.Open

    '判断指定名称的数据库是否存在

   Do While Not rs.EOF

      If LCase(rs.Fields("name")) = LCase(mydata) Then

         MsgBox "数据库<" & mydata & ">存在!", vbInformation

         Exit Sub

      End If

      rs.MoveNext

    Loop

       MsgBox "数据库<" & mydata & ">不存在!", vbInformation

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

End Sub

说明,上面的程序运行速度较慢,我们可以利用错误判断的方法提高查询速度,修改后的程序如下:

Public Sub 例3—4—1()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

   Dim mydata As String, SQL As String

   mydata = "NorthWind"   '指定数据库名称

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

   Set cnn = New ADODB.Connection

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "Password=11111;" _

       & "Data Source=THTFCOMPUTER"

   cnn.Open

    '判断指定名称的数据库是否存在

   SQL = "sp_helpdb" & mydata

   On Error GoTo hhh

   Set rs = cnn.Execute(SQL)

   MsgBox "数据库<" & mydata & ">存在!", vbInformation

   Exit Sub

hhh:

   MsgBox "数据库<" & mydata & ">不存在!", vbInformation

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

End Sub

3.4 判断数据表是否存在

当我们要通过Excel自动在某个SQL Server数据库中创建一个新的数据表时,如果在数据库中已经存在了一个同名的数据表,那么就会出现错误。因此,在创建数据表之前,首先要判断在SQL Server数据库中是否存在着与要创建的数据表同名的数据表。

3.4.1 利用SQL语句判断数据表是否存在

我们可以利用SQL语句来检查SQL Server数据库服务器上的某个数据库中是否存在某个数据表,基本方法就是SQL语句创建一个表名称的记录集,然后再循环这个表记录集,查看是否存在指定名称的数据表。创建表名称记录集的SQL语句格式如下:

SQL=”select name from sysobjects wherxtype=’U’”

【例3-5】下面的例子就是利用SQL语句判断在指定的SQLServer数据库中是否存在指定名称的数据表。这里,SQL Server数据库服务器的名称为“THTFC

OMPUTER”。

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

Public Sub 例3—5()

    Dim cnn As NewADODB.Connection

    Dim rs As ADODB.Recordset

    Dim SQL As String, mydataAs String, mytable As String

    mydata ="NorthWind"   '指定数据库名称

    mytable = "Customers"  '指定数据表名称

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalot=" & mydata

    cnn.Open

    '执行SQL语句创建数据表名称的记录集

    SQL = "select namefrom sysobjects where xtype='U'"

    Set rs = cnn.Execute(SQL)

    '判断指定名称的数据库是否存在

    Do While Not rs.EOF

       IfLCase(rs.Fields("name")) = LCase(mytable) Then

         MsgBox "数据表<" & mytable &">存在!",vbInformation

    Exit Sub

    rs.MoveNext

    Loop

    MsgBox "数据表不存在!", vbCritical

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

我们可以将上述的程序做成一个自定义函数,以便于任何一个程序都可以使用它。下面的自定义函数TableExist就是判断SQL Server服务器上某个数据库中是否存在指定名称的数据表,该函数的返回值为True或False,True表示数据表存在,False表示数据表不存在。该函数的两个必需参数cnn和mytable分别表示ADO的Connection对象变量和指定数据表的名称字符串。

Public Function TableExist(cnn As ADODB.Connection, mytable AsString) As Boolean

    TableExist = False

    Dim rs As NewADODB.Recordset

    Set rs =cnn.Execute("select name from sysobjects where xtype='U'")

    '判断指定名称的数据库是否存在

    Do While Not rs.EOF

       IfLCase(rs.Fields("name")) = LCase(mytable) Then

          TableExit = True

          Exit Function

          rs.MoveNext

    Loop

    rs.Close

    Set rs = Nothing

End Function

这样,在主程序中调用这个自定义函数的方法如下:

Public Sub 例3—5—1()

    Dim cnn As NewADODB.Connection

    Dim cnnStr As String,mydata As String, mytable As String

    mydata ="NorthWind"   '指定数据库名称

    mytable ="Customers"  '指定数据表名称

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalot=" & mydata

    cnn.Open

    If TableExist(cnn,mytable) = True Then

         MsgBox "数据表<" & mytable &">存在!",vbInformation

    Else

    MsgBox "数据表不存在!", vbCritical

    End If

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

3.4.2 利用ADO的OpenSchema方法判断数据表是否存在

ADO对象有一个特殊的OpenSchema方法,用于获取数据库的模式信息(例如:数据表、字段和索引等)。OpenSchema方法的语法如下(注意此时Recordset将以只读、静态游标的模式打开):

Set recordset = connection.OpenSchema(QueryType, Criteria, SchemaTD)

这里,参数QuerType指定任意的SchemaEnum值,表示要运行的模式查询的类型,常见的有以下几种模式类型:

当要查询数据表时,SchemaEnum值为“adSchemaTables。”

当要查询数据表中的字段时,SchemaEnum值为“adSchemaColumns”。

当要查询数据表中的索引时,SchemaEnum值为“adSchemaIndexes”。

当要查询数据表中的主键时,SchemaEnum值为“adSchemaPrinmaryKeys”。

参数Criteria为可选参数,用于限制模式查询的结果。例如,当要检查数据表或数据表的字段时,Criteria值可为“TABLE_CATALOG”、“TABLE_SCHEMA”、“TABLE_NAME”、“TABLE_TYPE”或“COLUMN_NAME”(注意这些名称的大小写)。

参数SchemaID为OLEDB规范未定义的操作规程提供者模式查询GUID。如果QueryType被设置为adSchemaProviderSpecific,则需要此参数;否则,就不使用它。

【例3-6】下面的例子就是利用ADO的OpenSchema方法判断在指定的SQLServer数据库中是否存在指定名称的数据表。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—6()

    Dim cnn As NewADODB.Connection

    Dim rs As NewADODB.Recordset

    Dim mydata As String,mytable As String

    mydata ="northwind"  '指定数据库名称

    mytable ="Customers" '指定数据表名称

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

    cnn.ConnectionString ="provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalog=" & mydata

    cnn.Open

    '创建数据表名称的记录集

    Set rs =cnn.OpenSchema(adSchemaTables)

    '开始查询是否存在该数据表

    Do Until rs.EOF

        IfLCase(rs!table_name) = LCase(mytable) Then

            MsgBox "数据表<" & mytable &">存在!",vbInformation

            Exit Sub

        End If

        '继续下一条记录

        rs.MoveNext

    Loop

    MsgBox "数据表<" & mytable &"> 不存在!",vbCritical

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

我们可以将上述的程序做成一个自定义函数,以便于任何一个程序都可以使用它。下面的自定义函数TableExist就是判断SQL Server服务器上某个数据库中是否存在指定名称的数据表,该函数的返回值为True或False,True表示数据表存在,False表示数据表不存在。该函数的两个必需参数cnn和mytable分别表示ADO的Connection对象变量和指定数据表的名称字符串。

Public Function TableExist(cnn As ADODB.Connection, mytable AsString) As Boolean

    TableExist = False

    Dim rs As NewADODB.Recordset

    Set rs =cnn.OpenSchema(adSchemaTables)

    '判断指定名称的数据库是否存在

    Do Until rs.EOF

        IfLCase(rs!table_name) = LCase(mytable) Then

           TableExist = True

           Exit Function

        End If

        '继续下一条记录

        rs.MoveNext

    Loop

    rs.Close

    Set rs = Nothing

End Function

3.4.3 利用ADOX判断数据表是否存在

我们还可以利用ADOX来判断在某数据库中是否存在指定名称的数据表。

ADOX即MicrosoftActiveX Data Objects Extensions for Data Definition Language and Sec

urity的缩写,它是对ADO对象和编程模型的扩展。ADOX可以用来执行一系列用ADO无法单独实现的功能。例如,使用ADO要想对已有的数据库的结构进行修改是非常麻烦的,但使用ADOX就可以很容易做到,同时ADOX还提供了提取数据库的用户信息或创建新的用户账号等方面的扩展。ADOX扩展了ADO的对象模型,提供了10个新的对象,它们都可以和ADO配合使用。比如可以用ADO的Connection对象连接到一个数据源,并提取出表、字段、索引、关键字段、存储过程等定义。但要注意的是,ADOX并不支持所有的数据库,它只局限于自由微软的Accecc、SQL Server等。

【例3-7】下面的例子就是利用ADOX判断在指定的SQLServer数据库中是否存在指定名称的数据表。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

在运行下面的程序之前,要确保已经引用了ADOX对象库Microsoft ADO Ext.2.5 for DDL andSecurity或Microsoft ADOExt.2.8 for DDL and Security。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例3—7()

    Dim mycat As ADOX.Catalog

    Dim myTbl As ADOX.Table

    Dim mydata As String,mytable As String

    mydata ="northwind"   '指定数据库名称

    mytable ="customers"  '指定数据表名称

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

    Set mycat = New ADOX.Catalog

    mycat.ActiveConnection ="provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalog=" & mydata

    '开始查询是否存在该数据表

    For Each myTbl Inmycat.Tables

        If LCase(myTbl.Name) =LCase(mytable) Then

           MsgBox "数据表<" & mytable &"> 存在!",vbInformation

           Exit Sub

        End If

    Next

    MsgBox "数据表" & mytable & "不存在!",vbCritical

    Set mycat = Nothing

    Set myTbl = Nothing

End Sub

如果我们要上述的程序做成一个自定义函数,以便于任何一个程序都可以使用它,则自定义函数程序代码如下,该函数的返回值为True或False,True表示数据表存在,False表示数据表不存在。该函数的两个必需参数cnn和mytable分别表示ADO的Connection对象变量和指定数据表的名称字符串。

Public Function TableExist(cnn As ADODB.Connection, mytable AsString) As Boolean

     TableExist = False

     Dim myCat As New ADOX.Catalog

     myCat.ActiveConnection =cnn

     For Each myTbl InmyCat.Tables

         If LCase(myTbl.Name)= LCase(mytable) Then

              TableExist =True

              Exit Function

         End If

    Next

    Set myCat = Nothing

    Set myTbl = Nothing

End Function

而要调用这个自定义函数,需要同时引用ADO和ADOX,此时主程序如下:

Public Sub 例3—7—1()

    Dim cnn As NewADODB.Connection

    Dim mydata As String,mytable As String

    mydata ="northwind"    '指定数据库名称

    mytable ="Customers"   '指定数据表名称

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

    cnn.ConnectionString ="provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalog=" & mydata

    cnn.Open

    '开始查询是否存在该数据表

    If TableExist(cnn,mytable) = True Then

        MsgBox "数据表 <" & mytable &"> 不存在!",vbInformation

    Else

        MsgBox "数据表" & mytable & "不存在!", vbCritical

    End If

    cnn.Close

    Set cnn = Nothing

End Sub

3.5 判断字段是否存在

在实际工作中,我们会碰到要往指定数据表中添加一个或数个新字段的情况,此时如果在数据表中已经存在了一个同名的字段,那么就会出现错误。同样,如果要删除数据表中不存在的字段也会出现错误。因此,在添加字段或删除字段之前,首先要判断在数据表中是否存在着与要添加字段同名的字段,或者判断在数据表中是否存在要删除的字段。

判断字段是否存在的方法有很多,下面我们介绍几种常用的方法。

3.5.1 利用SQL语句判断字段是否存在

利用SQL语句判断是否存在的基本思路就是通过执行查询指定数据表和指定字段的SQL语句,来检查指定数据表中是否存在指定名称的字段。此时,SQL语句的结构如下:

SQL = "select syscolumns.name,sysobjects.name" _

    & "fromsyscolumns,sysobjects" _

    & "whersysobjects.name = 数据表名 " _

    & "andsyscolumns.name = 字段名" _

【例3-8】下面的例子就是利用SQL语句判断在指定的SQLServer数据库和数据表中是否存在指定名称的字段。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—9()

    Dim cnn As NewADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim SQL As String, mydataAs String, mytable As String, mycolumn As String

    mydata ="northwind"    '指定数据库名称

    mytable ="Customers"   '指定数据表名称

    mycolumn ="Region"     '指定字段

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

    cnn.ConnectionString ="provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalog=" & mydata

    cnn.Open

    '执行SQL语句创建指定数据表中字段名称的记录集

    QL = "selectsyscolumns.name,sysobjects.name" _

    & "fromsyscolumns,sysobjects" _

    & "whersysobjects.name = '" & mytable & "' " _

    & "andsyscolumns.name = '" & mycolumn & "'"

    '判断指定名称的字段是否存在

    If rs.EOF And rs.EOF Then

        MsgBox "字段 <" & mycolumn &"> 不存在!",vbCritical

    Else

        MsgBox "字段<" & mycolumn &">存在!",vbCritical

    End If

    cnn.Close

    Set cnn = Nothing

    Set rs = nothin

End Sub

如果要将上述程序做成一个自定义函数,以便于任何一个程序都可以使用它,则自定义函数程序代码如下,该函数的返回值为True或False,True表示字段存在,False表示字段不存在。该函数的3个必需参数cnn、mytable和mycolumn分别表示ADO的Commection对象变量、指定数据表的名称字符串和指定字段的名称字符串。

Public Function ColumnExist(cnn As ADODB.Connection, mytable AsString, mycolumn As String) As Boolean

    Dim rs As NewADODB.Recordset

    SQL = "selectsyscolumns.name,sysobjects.name" _

    & "fromsyscolumns,sysobjects" _

    & "wher sysobjects.name = '"& mytable & "'" _

    & "andsyscolumns.name = '" & mycolumn & "'"

    Set rs = cnn.Execute(SQL)

    If rs.BOF And rs.EOF Then

        ColumnExist = False

    Else

        ColumnExist = True

    End If

    rs.Close

    Set rs = Nothing

End Function

此时,主程序中调用该自定义函数的方法如下:

Public Sub 例3—8—1()

    Dim cnn As NewADODB.Connection

    Dim mydata As String,mytable As String, mycolumn As String

    mydata ="northwind"    '指定数据库

    mytable ="customers"   '指定数据表

    mycolumn ="Region"     '指定字段

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

    cnn.ConnectionString ="provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalog=" & mydata

    cnn.Open

    '判断指定名称的字段是否存在

    If ColumnExist(cnn,mytable, mycolumn) = True Then

       MsgBox "字段<" & mycolumn &">存在!",vbInformation

    Else

       MsgBox "字段<" & mycolumn &">不存在!",vbCritical

    End If

    cnn.Close

    Set cnn = Nothing

End Sub

3.5.2 利用ADO的OpenSchema方法判断字段是否存在

将OpenSchema方法中的QueryType参数设置为adSchemaColumns,就可以获取字段信息,这样,通过循环OpenSchema方法所创建的查询记录集,就可以检查是否存在指定名称的字段。

【例3-9】下面的例子就是利用ADO的OpenSchema方法判断在指定的SQL Server数据库的某个数据表中是否存在指定名称的字段。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—9()

    Dim cnn As NewADODB.Connection

    Dim rs As NewADODB.Recordset

    Dim SQL As String, mydataAs String, mytable As String, mycolumn As String

    mydata ="northwind"    '指定数据库名称

    mytable ="Customers"   '指定数据表名称

    mycolumn ="Region"     '指定字段

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

    cnn.ConnectionString ="provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalog=" & mydata

    cnn.Open

    创建数据表名称的记录集

    Set rs =cnn.OpenSchema(adSchemaColumns)

    '开始查询是否存在该数据表

    Do Until rs.EOF

        IfLCase(rs!COLUMN_NAME) = LCase(mycolumn)_

        AndLCase(rs!TABLE_NAME) = LCase(mytable) then

           MsgBox "字段<" & mycolumn &"> 存在!",vbInformation

           Exit Sub

        End If

        '继续下一条记录

        rs.MoveNext

    Loop

        MsgBox "字段 <" & mycolumn & "> 不存在!", vbCritical

    rs.Close

    cnn.Close

    Set cnn = Nothing

    Set rs = Nothing

End Sub

请注意程序中使用rs!COLUMN_NAME返回字段名,使用rs!TABLE_NAME返回数据表名。由于利用ADO的OpenSchema方法创建的记录集包含了指定数据库中所有数据表的所有字段,因此需要判断rs!COLUMN_NAME是否为指定名称的字段以及rs!TABLE_NAME是否为指定名称的数据表。

3.5.3 利用ADOX判断字段是否存在

利用ADOX来判断在某数据表中是否存在指定名称的字段,与判断数据表是否存在的方法是一样的,即创建一个指定数据库的Catalog,然后循环指定数据表中的所有字段,并判断是否有指定名称的字段存在。

【例3-10】下面的例子就是利用ADOX判断在指定SQLServer中指定数据库的指定数据表中是否存在指定名称的字段。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

在运行下面的程序之前,要确保已经引用了ADO对象库Microsoft ADO Ext 2.5 for DDL andSecurity或Microsoft ADOExt 2.5 for DDL and Security。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例3—10()

    Dim myCat As ADOX.Catalog

    Dim myCol As ADOX.Column

    Dim mydata As String,mytable As String, mycolumn As String

    mydata ="Northwind"     '指定数据库名称

    mytable ="Customers"    '指定数据表名称

    mycolumn ="Region"      '指定字段

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

    Set myCat = NewADOX.Catalog

    myCat.ActiveConnection ="Provider=SQLOLEDB;" _

         & "UserID=sa;" _

         &"Password=11111;" _

         & "DataSource=THTFCOMPUTER;" _

         & "InitialCatalog=" & mydata

    '开始查询是否存在该数据表

    For Each myCol InmyCat.Tables(mytable).Columns

        If LCase(myCol.Name) =LCase(mycolumn) Then

           MsgBox "在数据表<" & mytable &">中存在字段<"& mycolumn & ">!"

           Exit Sub

        End If

    Next

    MsgBox "在数据表<" & mytable &">中不存在字段<"& mycolumn & ">!"""

    Set myCat = Nothing

    Set myCol = Nothing

End Sub

3.5.4 利用查询记录集判断字段是否存在

利用查询记录集判断字段是否存在可能是最简单的一种方法了。其基本原理就是创建一个全表的查询记录集,然后循环该记录集的字段名,以检查是否存在指定名称的字段。

【例3-11】下面的例子就是用查询记录集的方法判断在指定的SQL Server数据库的某个数据表中是否存在指定名称的字段。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—11()

    Dim cnn As NewADODB.Connection

    Dim rs As NewADODB.Recordset

    Dim SQL As String, mydataAs String, mytable As String, mycolumn As String

    Dim i As Integer

    mydata ="NorthWind"     '指定数据库名称

    mytable ="Customers"    '指定数据表名称

    mycolumn ="Region"      '指定字段

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

         & "UserID=sa;" _

         &"Password=11111;" _

         & "DataSource=THTFCOMPUTER;" _

         & "InitialCatalog=" & mydata

    cnn.Open

    '创建查询记录集

    Set rs =cnn.Execute(mytable)

    '开始查询是否存在指定名称的字段

    For i = 0 Tors.Fields.Count - 1

        IfLCase(rs.Fields(i).Name) = LCase(mycolumn) Then

           MsgBox "字段<" & mycolumn &">存在!",vbInformation

           Exit Sub

        End If

    Next i

    MsgBox "字段<" & mycolumn &"> 不存在!",vbCritical

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

还可以将上述程序做成一个自定义函数,以便于任何一个程序都可以使用它,则自定义函数程序代码如下,该函数的返回值为True或False,True表示字段存在,False表示字段不存在。该函数的3个必需参数cnn、mytable和mycolumn分别表示ADO的Connection对象变量、指定数据表的名称字符串和指定字段的名称字符串。

Public Function ColumnExist(cnn As ADODB.Connection, mytable AsString, mycolumn As String) As Boolean

    ColumnExist = False

    Dim rs As NewADODB.Recordset

    Dim i As Integer

    Set rs =cnn.Execute(mytable)

    For i = 0 Tors.Fields.Count - 1

        If LCase(rs.Fields(i).Name)= LCase(mycolumn) Then

            ColumnExist = True

            Exit Function

        End If

    Next i

    Set rs = Nothing

End Function

3.6 判断索引是否存在

利用索引可以加快查询速度。一般情况下,在创建SQL Server数据库和数据表时,我们就已经为数据表创建了索引。但是,有些情况下我们需要在已有的数据表中创建新的索引。那么,为了能够成功创建索引,就需要先判断数据表中是否已经存在了指定名称的索引。

与判断数据表中字段是否存在的方法一样,判断数据表中是否存在索引的方法也有很多,下面我们介绍几种常用的方法。

3.6.1 利用SQL语句判断索引是否存在

利用SQL语句判断索引是否存在的基本思路就是通过执行查询指定数据表和指定索引的SQL语句,来检查在指定数据表中是否存在指定名称的索引。此时,SQL语句的结构如下:

SQL = "select sysindexes.name,sysobjects.name" _

    & "fromsysindexes,sysobjects" _

    & "wheresysobjects.name = 数据表名" _

    & "andsysindexes.name = 索引名"

【例3-12】下面的例子就是利用SQL语句判断在指定的SQLServer数据库和数据表中是否存在指定名称的索引。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—12()

    Dim cnn As NewADODB.Connection

    Dim rs As NewADODB.Recordset

    Dim SQL As String, mydataAs String, mytable As String, myIndex As String

    mydata ="NorthWind"    '指定数据库

    mytable ="Customers"   '指定数据表

    myIndex = "PK_Customers"

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

    cnn.ConnectionString ="provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "InitialCatalog=" & mydata

    cnn.Open

    '执行SQL语句创建指定数据表中字段名称的记录集

    SQL = "selectsysindexes.name,sysobjects.name" _

        & "fromsysindexes,sysobjects" _

        & "wheresysobjects.name = '" & mytable & "'" _

        & "andsysindexes.name = '" & myIndex & "'"

    Set rs = cnn.Execute(SQL)

    '判断指定名称的索引是否存在

    If rs.BOF And rs.EOF Then

        MsgBox "在数据表<" & mytable &">中没有名称为<"& myIndex & ">的索引", vbCritical

    Else

        MsgBox "在数据表<" & mytable &">中存在名称为<"& myIndex & ">的索引", vbInformation

    End If

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

3.6.2 利用OpenSchema方法判断索引是否存在

将OpenSchema方法中的QuerType参数设置为adSchemaIndexes,就可以获取索引信息,这样,通过循环OpenSchema方法所创建的索引记录集,就可以检查在指定数据表中是否存在指定名称的索引。

【例3-13】下面的例子就是利用ADO的OpenSchema方法判断在指定的SQL Server数据库的某个数据表中是否存在指定名称的索引。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—13()

    Dim cnn As NewADODB.Connection

    Dim rs As NewADODB.Recordset

    Dim mydata As String,mytable As String, myIndex As String

    mydata ="NorthWind"       '指定数据库名称

    mytable ="Customers"      '指定数据表名称

    myIndex ="PK_Customers"   '指定索引名称

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "UserID=sa;" _

        &"Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "IntialCatalot=" & mydata

    cnn.Open

    '创建索引名称的记录集

    Set rs =cnn.OpenSchema(adSchemaIndexes)

    '开始查询是否存在该数据表

    Do Until rs.EOF

        IfLCase(rs!INDEX_NAME) = LCase(myIndex) _

        AndLCase(rs!TABLE_NAME) = LCase(mytable) Then

            MsgBox "索引 <" & myIndex &"> 存在!",vbInformation

            Exit Sub

        End If

        '继续下一条记录

        rs.MoveNext

    Loop

    MsgBox "索引<" & myIndex &"> 不存在!",vbCritical

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

请注意程序中使用rs!INDEX_NAME返回索引名,使用rs!TABLE_NAME返回数据表名。由于利用ADO的OpenSchema方法创建的记录集包含了指定数据库中所有数据表的所有索引,因此需要判断rs!INDEX_NAME是否为指定名称的索引以及rs!TABLE_NAME是否为指定名称的数据表。

3.6.3 利用ADOX判断索引是否存在

利用ADOX来判断在某数据表中是否存在指定名称的索引,与判断字段是否存在的方法是一样的,即创建一个指定数据库的Catalog,然后循环指定数据表中的所有索引,并判断是否有指定名称的索引存在。

【例3-14】下面的例子就是利用ADOX判断在指定的SQLServer中指定数据库的指定数据表中是否存在指定名称的索引。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—14()

     DimmyCat As ADOX.Catalog

     Dim myIdx As ADOX.Index

     Dim mydata As String, mytable As String,myIndex As String

     mydata = "NorthWind"        '指定数据库名称

     mytable = "Customers"       '指定数据表名称

     myIndex = "PK_Customers"    '指定索引名称

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

     Set myCat = New ADOX.Catalog

     myCat.ActiveConnection ="Provider=SQLOLEDB;" _

          & "User ID=sa;" _

          & "Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & "Intial Catalot=" &mydata

    '开始查询是否存在索引

    For Each myIdx InmyCat.Tables(mytable).Indexes

         If LCase(myIdx.Name) = LCase(myIndex)Then

             MsgBox "在数据表<" & mytable &">中存在索引<"& myIndex & ">!"

             Exit Sub

        End If

    Next

    MsgBox "在数据表<" & mytable & "> 中不存在索引<" & myIndex &">!"""

    Set myCat = Nothing

    Set myIdx = Nothing

End Sub

3.7 获取SQL Server服务器上所有的数据库清单

3.7.1 利用SQL语句获取数据库清单

获取SQL Server服务器上所有的数据库清单,可以利用SQL语句创建一个SQLServer数据库信息的查询记录集,然后再将这个查询记录集中的每个记录复制到工作表。创建SQL Server数据库信息查询记录集的SQL语句如下:

SQL = “select *from sysdatabases”

记录集中各列的名称及其描述如表3-1所示。

表3-1 SQL Server数据库信息

列名

数据类型

描述

name

sysname

数据库的名称

dbid

smallint

数据库ID

sid

varbinary(85)

数据库创建者的系统ID

mode

smallint

用于创建数据库时在内部锁定该数据库

status

int

状态位

status2

int

状态位2

crdate

datetime

创建日期

reserved

datetime

留作以后使用

category

int

包含用于复制的信息位图

cmptlevel

tinyint

数据库的兼容级别

filename

mvarchar(260)

数据库主文件的操作系统路径和名称

version

smallint

创建数据库时使用的SQL Server代码内部版本号,仅供SQL Server工具在内部用于升级处理

【例3-15】下面的例子就是利用SQL语句获取SQL Server服务器上所有的数据库清单(包括数据库名称、数据库ID、数据库创建者的系统ID、状态位、创建日期、数据库主文件的操作系统路径和名称等信息),并复制到工作表。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—15()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim cnnStr As String, SQL As String, mydataAs String

    Dim i As Integer

    mydata = "NorthWind"       '指定数据库名称

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

    cnnStr = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "Password=11111;" _

        & "DataSource=THTFCOMPUTER"

    cnn.ConnectionString = cnnStr

    cnn.Open

    '执行SQL语句创建数据库名称的记录集

    SQL = "select * from sysdatabases"

    Set rs = cnn.Execute(SQL)

    '获取数据库信息清单

    Cells.Clear

    Range("A1:F1") = Array("数据库名称", "数据库ID", "数据库创建者的系统ID" _

         , "状态位", "创建日期", "数据库主文件的操作系统路径和名称")

    i = 1

    Do While Not rs.EOF

        Cells(i + 1, 1) = rs.Fields("name")

        Cells(i + 1, 2) =rs.Fields("dbid")

        Cells(i + 1, 3) =rs.Fields("sid")

        Cells(i + 1, 4) =rs.Fields("status")

        Cells(i + 1, 5) =Format(rs.Fields("crdate"), "yyyy-mm-dd")

        Cells(i + 1, 6) =rs.Fields("filename")

        rs.MoveNext

        i = i + 1

    Loop

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

3.7.2 利用存储过程获取数据库清单

我们还可以利用存储过程sp_helpdb来获取数据库名称、大小、用户名称、创建日期和状态等信息。此时,SQL语句如下:

SQL = “sp_helpdb数据库名”

或者

SQL = “sp_helpdb”

前者将只获取指定数据库的信息清单,后者将获取服务器上所有的可用数据库的信息清单。

【例3-16】下面的例子就是利用存储过程sp_helpdb获取SQL Server服务器上所有的数据库名称、大小、用户名称、创建日期和状态等信息,并复制到工作表。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—16()

    Dim cnn As New ADODB.Connection

    Dim rs As ADODB.Recordset

    Dim mydata As String

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

    Set cnn = New ADODB.Connection

    cnn.connectinString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "Password=11111;" _

        & "DataSource=THTFCOMPUTER"

    cnn.Open

    '获取所有数据库信息,并复制到工作表

    Set rs = cnn.Execute("sp_helpdb")

    Cells.Clear

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

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

    Next i

    Range("A2").CopyFromRecordset rs

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

3.8 获取指定数据库中所有的数据表信息清单

实际上,在前面介绍判断数据表是否存在时,就已经给出了获取指定数据库中所有的数据表清单的方法。下面介绍具体的方法和程序代码。

3.8.1 利用SQL语句获取数据表信息清单

利用SQL语句获取数据表信息清单,其基本方法就是利用SQL语句创建一个数据表信息的记录集,然后再将这个记录集复制到工作表。创建表名称记录集的SQL语句格式如下:

SQL =“select * from sysobjects wherxtype=’U’”

【例3-17】下面的例子就是利用SQL语句获取指定数据库中所有的数据表信息清单。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—17()

    Dim cnn As New ADODB.Connection

    Dim rs As ADODB.Recordset

    Dim SQL As String, mydata As String

    Dim i As Integer

    mydata = "NorthWind"    '指定数据库名称

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

    cnn.connectinString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "Password=11111;" _

        & "Data Source=THTFCOMPUTER;"_

        & " Initial Catalog=" &mydata

    cnn.Open

    '执行SQL语句创建数据表名称的记录集

    SQL = "select * from sysobjects wherextype='U'"

    Set rs = cnn.Execute(SQL)

    '复制数据表的信息名称

    Cells.Clear

    '复制表的各项信息名称

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

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

    Next i

    '复制各个数据表的信息数据

    Range("A2").CopyFromRecordset rs

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

说明:如果我们仅仅想获取数据表的名称,只要将SQL语句改为下面情形就可以了:

SQL = “select name from sysobjects wherextype=’U’”

如果我们仅仅想获取数据表的名称和创建日期,则需要将SQL语句改为下面情形:

SQL = “select name,crdate from sysobjectswhere xtype=’U’”

3.8.2 利用ADO的OpenSchema方法获取数据表信息清单

利用ADO的OpenSchema方法获取数据表信息清单,与利用ADO的OpenSchema方法判断数据表是否存在的方法是一样的,即首先创建一个记录集,然后再获致数据表的名称、类型、创建日期、修改日期和所在数据库等信息。

需要注意的是,这种方法获取的数据表包括全部的表(系统表、普通的数据表和视图等)。

【例3-18】下面的例子就是利用存储过程OpenSchema方法获取SQL Server服务器上所有的数据表的信息清单,包括表名称、类型、创建日期和所在数据库等信息。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—18()

    Dim cnn As New ADODB.Connection

    Dim rs As ADODB.Recordset

    Dim SQL As String, mydata As String

    mydata = "NorthWind"    '指定数据库名称

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

    cnn.connectinString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & " Initial Catalog="& mydata

    cnn.Open

    '创建数据表名称的记录集

    Set rs = cnn.OpenSchema(adSchemaTables)

    '复制数据表的信息名称

    Cells.Clear

    Range("A1:E1") = Array("表名称", "类型", "创建日期", "修改日期", "所在数据库")

    i = 1

    Do While Not rs.EOF

       Cells(i + 1, 1) = rs.Fields("TABLE_NAME")

       Cells(i + 1, 2) =rs.Fields("TABLE_TYPE")

       Cells(i + 1, 3) =Format(rs.Fields("DATE_CREATED"), "yyyy-mm-dd")

       Cells(i + 1, 4) =Format(rs.Fields("DATE_MODIFIED"), "yyyy-mm-dd")

       Cells(i + 1, 5) =rs.Fields("TABLE_CATALOG")

       rs.MoveNext

       i = i + 1

    Loop

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

如果想获取指定数据库中所有表的全部信息数据,需要将上面的程序进行修改,如下所示:

Public Sub 例3—18—1()

    Dim cnn As New ADODB.Connection

    Dim rs As ADODB.Recordset

    Dim SQL As String, mydata As String

    mydata = "NorthWind"    '指定数据库名称

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

    cnn.connectinString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & " Initial Catalog="& mydata

    cnn.Open

    '创建数据表名称的记录集

    Set rs = cnn.OpenSchema(adSchemaTables)

    '复制数据表的信息名称

    Cells.Clear

    复制数据表的全部信息

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

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

    netx i

    复制各个数据表的信息数据

    Range("A2").CopyFromRecordset rs

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

而如果仅仅想的得到普通的数据表,则需要对程序进行如下修改:

Public Sub 例3—18—2()

    Dim cnn As New ADODB.Connection

    Dim rs As ADODB.Recordset

    Dim SQL As String, mydata As String

    mydata = "NorthWind"    '指定数据库名称

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

    cnn.connectinString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & " Initial Catalog="& mydata

    cnn.Open

    '创建数据表名称的记录集

    Set rs = cnn.OpenSchema(adSchemaTables)

    '复制数据表的信息

    Cells.Clear

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

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

    netx i

    '复制各个数据表的信息数据

    k = 1

    Do While Not rs.EOF

       If rs.Fields("TABLE_TYPE") ="TABLE" Then

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

              Cells(k + 1, i + 1) =rs.Fields(i)

          Next i

          k = k + 1

        End If

        rs.MoveNext

    Loop

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

如果仅仅想的得到数据库中的视图表,则需要对程序进行如下修改:

Public Sub 例3—18—3()

    Dim cnn As New ADODB.Connection

    Dim rs As ADODB.Recordset

    Dim SQL As String, mydata As String

    mydata = "NorthWind"    '指定数据库名称

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

    cnn.connectinString = "Provider=SQLOLEDB;"_

        & "User ID=sa;" _

        & "Password=11111;" _

        & "DataSource=THTFCOMPUTER;" _

        & " Initial Catalog="& mydata

    cnn.Open

    '创建数据表名称的记录集

    Set rs = cnn.OpenSchema(adSchemaTables)

    '复制数据表的信息

    Cells.Clear

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

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

    netx i

    '复制各个数据表的信息数据

    k = 1

    Do While Not rs.EOF

       If rs.Fields("TABLE_TYPE") ="TABLE" Then

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

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

          Next i

          '复制各个数据表的信息数据

          k = k + 1

        End If

        rs.MoveNext

    Loop

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

3.8.3 利用ADOX获取数据表信息清单

利用ADOX来获取某数据库中所有数据表信息清单也是非常简单的。下面是一个具体的例子。

【例3-19】下面的例子就是利用ADOX判断在指定的SQL Server数据库中所有的普通数据表信息清单。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

在运行下面的程序之前,要确保已经引用了ADOX对象库Microsoft ADO Ext.2.5 for DDL andSecurity或Microsoft ADOExt.2.8 for DDL and Security。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例3_19()

    Dim myCat As ADOX.Catalog

    Dim myTbl As ADOX.Table

    Dim mydata As String

    mydata = "NorthWind"        '指定数据库名称

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

    Set myCat = New ADOX.Catalog

    myCat.ActiveConnection ="Provier=SQLOLEDB;" _

          & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    '复制数据表的信息

    Cells.Clear

    Range("A1:D1") = Array("表名称", "类型", "创建日期", "修改日期")

    i = 1

    For Each myTbl In myCat.Tables

        Cells(i + 1, 1) = myTbl.Name

        Cells(i + 1, 2) = myTbl.Type

        Cells(i + 1, 3) =Format(myTbl.DateCreated, "yyyy-mm-dd")

        Cells(i + 1, 4) = Format(myTbl.DateCreated,"yyyy-mm-dd")

        i = i + 1

    Next

    Cells.Columns.AutoFit

    Set myCat = Nothing

    Set myTbl = Nothing

End Sub

而如果仅仅想的得到普通的数据表,则需要对程序修改如下:

Public Sub 例3_19_1()

    Dim myCat As ADOX.Catalog

    Dim myTbl As ADOX.Table

    Dim mydata As String

    mydata = "NorthWind"        '指定数据库名称

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

    Set myCat = New ADOX.Catalog

    myCat.ActiveConnection ="Provier=SQLOLEDB;" _

          & "User ID=sa;" _

          & "Password=11111;" _

          & "Data Source=THTFCOMPUTER;"_

          & "Initial Catalog="& mydata

    '复制数据表的信息

    Cells.Clear

    Range("A1:D1") = Array("表名称", "类型", "创建日期", "修改日期")

    i = 1

    For Each myTbl In myCat.Tables

        If myTbl.Type = "TABLE" Then

           Cells(i + 1, 1) = myTbl.Name

           Cells(i + 1, 2) = myTbl.Type

           Cells(i + 1, 3) =Format(myTbl.DateCreated, "yyyy-mm-dd")

           Cells(i + 1, 4) =Format(myTbl.DateCreated, "yyyy-mm-dd")

           i = i + 1

        End If

    Next

    Cells.Columns.AutoFit

    SetmyCat = Nothing

    Set myTbl = Nothing

End Sub

如果仅仅想的得到数据库中的视图表,则需要对程序进行如下的修改:

Public Sub 例3_19_2()

    Dim myCat As ADOX.Catalog

    Dim myTbl As ADOX.Table

    Dim mydata As String

    mydata = "NorthWind"        '指定数据库名称

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

    Set myCat = New ADOX.Catalog

    myCat.ActiveConnection ="Provier=SQLOLEDB;" _

          & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    '复制数据表的信息

    Cells.Clear

    Range("A1:D1") = Array("表名称", "类型", "创建日期", "修改日期")

    i = 1

    For Each myTbl In myCat.Tables

        If myTbl.Type = "VIEW" Then

           Cells(i + 1, 1) = myTbl.Name

           Cells(i + 1, 2) = myTbl.Type

           Cells(i + 1, 3) =Format(myTbl.DateCreated, "yyyy-mm-dd")

           Cells(i + 1, 4) =Format(myTbl.DateCreated, "yyyy-mm-dd")

           i = i + 1

        End If

    Next

    Cells.Columns.AutoFit

    Set myCat = Nothing

    Set myTbl = Nothing

End Sub

3.9 获取指定数据表中所有的字段信息清单

获取指定数据表中所有的字段信息清单,包括字段名称、数据类型、字段长度、字段默认值和是否允许空值等信息,有助于我们对数据表结构进行维护。实际上,在前面介绍判断字段是否存在时,就已经给出了获取指定数据表中所有的字段的方法。下面我们介绍具体的方法和程序代码。

3.9.1 利用SQL语句获取指定数据表的全部字段信息清单

利用SQL语句获取指定数据表的全部字段信息清单比较复杂,其SQL语句结构如下:

SQL ="select object_name(c.id) as 表名," _

    & "c.name as 字段名,c.type as 数据类型,c.length as长度," _

    & "c.prec as 精度,c.isnullable as 是否允许空值" _

    & "from syscolumns c" _

    & "where object_name(c.id)=表名"

但是,需要注意的是,数据类型返回值是一个整数,比如,返回值39表示nchar或nvarchar,111表示datetine,110表示money等。而“是否允许空值”返回一个整数0(不允许空值)或1(允许空值)。

下面的例子就是利用SQL语句获取指定数据表的全部字段信息清单。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

在运行下面的程序之前,要确保已经引用了ADOX对象库Microsoft ADO Ext.2.5 for DDL andSecurity或Microsoft ADOExt.2.8 for DDL and Security。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例3—20()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

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

    Dim i As Integer

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString = "Provider=SQLOLEDB;"_

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '执行SQL语句创建字段信息记录集

    SQL = "select object_name(c.id) as 表名," _

        & "c.name as 字段名,c.type as 数据类型,c.length as长度," _

        & "c.prec as 精度,c.isnullable as 是否允许空值" _

        & "from syscolumns c" _

        & "whereobject_name(c.id)='" & mytable & "'"

    Set rs = cnn.Execute(SQL)

    '复制字段信息名称

    Cells.Clear

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

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

    Next i

    '复制各个字段的信息数据

    Range("A2").CopyFromRecordset rs

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

运行上面的程序,就得到如图3-1所示的结果(示例数据)。

3.9.2 利用OpenSchema方法获取指定数据表的全部字段信息清单

利用ADO的OpenSchema方法获取字段信息清单,与利用ADO的OpenSchema方法获取数据表清单的方法是一样的,即首先创建一个记录集,然后再获取字段的名称、类型和长度等信息。

【例3-21】下面的例子就是利用ADO的OpenSchema方法获取指定的SQL Server数据库中所有数据表的信息清单,包括表名称、类型、创建日期、修改日期和所在数据库等信息。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—21()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

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

    Dim i As Integer

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '创建数据表名称的记录集

    Set rs = cnn.OpenSchema(adSchemaColumns)

    '复制数据表的信息数据

    Cells.Clear

    Range("A1:I1") = Array("所在数据库", "所在数据表", "字段名称", "数据类型", _

           "字段长度", "是否允许空值", "数据精度", "是否有默认值", "默认值")

    i = 1

    Do While Not rs.EOF

        If rs.Fields("TABLE_NAME") =mytable Then

           Cells(i + 1, 1) =rs.Fields("TABLE_CATALOG")

           Cells(i + 1, 2) =rs.Fields("TABLE_NAME")

           Cells(i + 1, 3) =rs.Fields("COLUMN_NAME")

           Cells(i + 1, 4) =rs.Fields("DATA_TYPE")

           Cells(i + 1, 5) =rs.Fields("CHATACTER_MAXIMUM_LENGTH")

           Cells(i + 1, 6) =rs.Fields("IS_NULLABLE")

           Cells(i + 1, 7) =rs.Fields("NUMERIC_PRECISION")

           Cells(i + 1, 8) =rs.Fields("COLUMN_HASDEFAULT")

           Cells(i + 1, 9) =rs.Fields("COLUMN_DEFAULT")

           i = i + 1

        End If

        rs.MoveNext

    Loop

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

运行上面的程序,就得到如图3-2所示的结果(示例数据)。

注意这里的字段数据类型返回值也是一个整数,3表示int,6表示money,130表示nchar或nvarchar,135表示datetime,这些数字所打赌数据类型与【例3-18】中的数字含义是不一样的。如果要获取指定数据库中所有表的所有字段信息,则需要将上面的程序修改如下:

Public Sub 例3—21—1()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    mydata = "NorthWind"       '指定数据库名称

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

    cnn.ConnectionString = "Provider=SQLOLEDB;"_

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '创建字段信息的记录集

    Set rs = cnn.OpenSchema(adSchemaColumns)

    '复制字段信息

    Cells.Clear

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

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

    Next i

    '复制各个字段的信息数据

    Range("A2").CopyFromRecordset rs

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

而如果要获取某个数据表的全部字段的所有信息,而不是像图3-2所示的那样仅仅获取字段的部分信息,那么就需要将程序修改如下:

Public Sub 例3—21—2()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

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

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '创建字段的记录集

    Set rs = cnn.OpenSchema(adSchemaColumns)

    '复制字段信息

    Cells.Clear

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

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

    Next i

    '复制指定数据表的各个字段的全部信息数据

    K = 1

    Do While Not rs.EOF

       Ifrs.Fields("TABLE_NAME") = mytable Then

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

             Cells(K + 1, i + 1) = rs.Fields(i)

          Next i

          K = K + 1

        End If

        rs.MoveNext

    Loop

    Cells.Columns.AutoFit

    rs.Close

   cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

3.9.3 利用数据表查询记录集对象获取指定数据表的全部字段信息清单

利用数据表查询记录集对象获取指定数据表的全部字段信息清单的基本方法就是创建一个数据表的查询记录集,然后循环记录集的各个字段,获取各个字段的名称,数据类型和字段长度等信息。

【例3-22】下面的例子就是利用数据表查询记录集对象获取指定数据表的全部字段信息清单。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—20()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

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

    Dim i As Integer

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '执行SQL语句创建字段信息记录集

    SQL = "select object_name(c.id) as 表名," _

        & "c.name as 字段名,c.type as 数据类型,c.length as长度," _

        & "c.prec as 精度,c.isnullable as 是否允许空值" _

        & "from syscolumns c" _

        & "whereobject_name(c.id)='" & mytable & "'"

    Set rs = cnn.Execute(SQL)

    '复制字段信息名称

    Cells.Clear

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

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

    Next i

    '复制各个字段的信息数据

    Range("A2").CopyFromRecordset rs

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

Public Sub 例3—22()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim myfield As ADODB.Field

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

    Dim i As Integer

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '创建查询记录集

    Set rs = cnn.Execute(mytable)

    '将字段信息复制到工作表

    Cells.Clear

    Range("A1:D1") = Array("字段名称", "数据类型", "字段大小", "数字精度")

    i = 2

    For Each myfield In rs.Fields

    '将字段名称,类型和大小输出到工作表

    Range("A" & i) =myfield.Name     '获取字段名称

    Range("B" & i) =myfield.Type     '获取数据类型

    Range("C" & i) =myfield.DefinedSize         '获取字段长度

    Range("D" & i) =myfield.Precision           '获取数字精度

    i = i + 1

    Next

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set myfield = Nothing

    Set rs = Nothing

    Set cnn = Nothing

End Sub

运行上面的程序,就得到如图3-3所示的结果(示例数据)。

注意这里的字段数据类型返回值也是一个整数,3表示int,6表示money,130表示nchar,202表示nvarchar,135表示datetime,这些数字所打赌数据类型与【例3-18】中的数字含义是不一样的。

3.9.4 利用ADOX获取指定数据表中所有字段信息清单

利用ADOX获取指定数据表中所有字段信息清单与利用ACOX来判断在某数据表中是否存在指定名称字段的方法是一样的,即创建一个指定数据库的Catalog,然后循环指定数据表中的所有字段,并获取各个名称的有关信息。

【例3-23】下面的例子就是利用ADOX获取指定的SQL Server数据表的所有字段的有关信息。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

在运行下面的程序之前,要确保已经引用了ADOX对象库Microsoft ADO Ext.2.5 for DDL andSecurity或Microsoft ADOExt.2.8 for DDL and Security。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例3—23()

    Dim myCat As ADOX.Catalog

    Dim myCol As ADOX.Column

    Dim mydata As String, mytable As String

    Dim i As Integer

    mydata = "NorthWind"     '指定数据库名称

    mytable = "Orders"       '指定数据表名称

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

    myCat.ActiveConnection ="Provider=SQLOLEDB;" _

          & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    '将各个字段的有关信息复制到工作表

    Cells.Clear

    i = 2

    Range("A1:D1") = Array("字段名称", "数据类型", "字段大小", "数字精度")

    For Each myCol InmyCat.Tables(mytable).Columns

        Range("A" & i) =myCol.Name        '获取字段名称

        Range("B" & i) =myCol.Type        '获取数据类型

        Range("C" & i) =myCol.DefinedSize '获取数据长度

        Range("D" & i) =myCol.Precision   '获取数字精度

        i = i + 1

    Next

    Cells.Columns.AutoFit

    Set myCat = Nothing

    Set myCol = Nothing

End Sub

3.10 获取所有的索引清单

获取指定数据表中所有的索引信息清单,包括索引名称、对应字段等信息,与前面介绍判断索引是否存在的方法是基本相同的。

3.10.1 利用SQL语句获取指定数据表的全部索引信息清单

利用SQL语句获取指定数据表的全部索引信息清单的基本思路,就是通过执行查询指定数据表索引的SQL语句,来创建一个索引记录集,然后将这个记录集复制到工作表,SQL语句的结构如下:

SQL = “exec sp_helpindex 数据表名”

【例3024】下面的例子就是利用SQL语句获取指定数据表的全部索引信息清单。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—24()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim myfield As ADODB.Field

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

    Dim i As Integer

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '创建索引记录集

    SQL = "exec sp_helpindex" &mytable

    Set rs = cnn.Execute(SQL)

    '将索引信息复制到工作表

    Cells.Clear

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

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

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

    Next i

    '复制各个字段的信息数据

    Range("A2").CopyFromRecordset rs

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set myfield = Nothing

    Set rs = Nothing

    Set cnn = Nothing

End Sub

运行上面的程序,就得到如图3-4所示的结果(示例数据)。

在图3-4中,index_name表示索引名称,index-description为对索引的描述,index_keys为索引对应的字段名称。

3.10.2 利用OpenSchema方法获取指定数据表的全部索引信息清单

利用ADO的OpenSchema方法获取索引信息清单,与利用ADO的OpenSchema判断索引是否存在的方法是一样的,即首先创建一个记录集,然后再获致索引的名称,对应字段等信息。

【例3-25】下面的例子就是利用ADO的OpenSchema方法获取指定数据表的所有索引信息清单。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

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

Public Sub 例3—25()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

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

    Dim i As Integer

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '创建索引记录集

    Set rs = cnn.OpenSchema(adSchemaIndexes)

    '复制索引的信息

    Cells.Clear

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

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

    Next i

    '复制指定数据表的各个索引的全部信息数据

    K = 1

    Do While Not rs.EOF

       If rs.Fields("TABLE_NAME") =mytable Then

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

             Cells(K + 1, i + 1) = rs.Fields(i)

          Next i

          K = K + 1

        End If

        rs.MoveNext

    Loop

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

运行上面的程序,就得到如图3-5所示的结果(示例数据)。

图3-5所示的索引信息包括了索引的全部信息数据。如果我们仅仅需要了解索引所在的数据库、数据表、索引名称、是否主键、是否唯一索引、是否聚集索引和指定字段等信息,则需要将上面的程序修改如下:

Public Sub 例3—23()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

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

    Dim i As Integer

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '执行SQL语句创建字段信息记录集

    SQL = "select object_name(c.id) as 表名," _

        & "c.name as 字段名,c.type as 数据类型,c.length as长度," _

        & "c.prec as 精度,c.isnullable as 是否允许空值" _

        & "from syscolumns c" _

        & "whereobject_name(c.id)='" & mytable & "'"

    Set rs = cnn.Execute(SQL)

    '复制字段信息名称

    Cells.Clear

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

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

    Next i

    '复制各个字段的信息数据

    Range("A2").CopyFromRecordset rs

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

Public Sub 例3—25—1()

    Dim cnn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

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

    mydata = "NorthWind"       '指定数据库名称

    mytable = "Orders"         '指定数据表

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

    cnn.ConnectionString ="Provider=SQLOLEDB;" _

        & "User ID=sa;" _

          & "Password=11111;" _

          & "DataSource=THTFCOMPUTER;" _

          & "Initial Catalog="& mydata

    cnn.Open

    '创建索引记录集

    Set rs = cnn.OpenSchema(adSchemaIndexes)

    '复制索引的信息

    Cells.Clear

    Range("A1G1") = Array("所在数据库", "所在数据表", "索引名称", _

         "是否主键", "是否唯一", "是否聚集", "指定字段")

    i = 1

    Do While Not rs.EOF

        If rs.Fields("TABLE_NAME") =mytable Then

           Cells(i + 1, 1) =rs.Fields("INDEX_CATALOG")

           Cells(i + 1, 2) =rs.Fields("TABLE_NAME")

           Cells(i + 1, 3) =rs.Fields("INDEX_NAME")

           Cells(i + 1, 4) =rs.Fields("PRIMARY_KEY")

           Cells(i + 1, 3) =rs.Fields("IMDEX_NAME")

           Cells(i + 1, 4) =rs.Fields("PRIMARY_KEY")

           Cells(i + 1, 5) =rs.Fields("UNIQUE")

           Cells(i + 1, 6) =rs.Fields("CLUSTERED")

           Cells(i + 1, 7) =rs.Fields("COLUMN_NAME")

           i = i + 1

        End If

        rs.MoveNext

    Loop

    Cells.Columns.AutoFit

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

运行上面的程序,就得到如图3-6所示的结果(示例数据)。

3.10.3 利用ADOX获取指定数据表中所有索引信息清单

利用ADOX获取指定数据表中所有索引信息清单,与利用ADOX来判断在某数据表中是否存在指定名称索引的方法是一样的,即创建一个指定数据库的Catalog,然后循环指定数据表中的所有索引,并获取各个索引的有关信息。

【例3-26】下面的例子就是利用ADOX获取指定的SQL Server数据表的所有索引的有关信息。这里,SQL Server数据库服务器的名称为“THTFCOMPUTER”。

在运行下面的程序之前,要确保已经引用了ADOX对象库Microsoft ADO Ext.2.5 for DDL andSecurity或Microsoft ADOExt.2.8 for DDL and Security。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例3—26()

    Dim myCat As ADOX.Catalog

    Dim myIdx As ADOX.Index

    Dim mydata As String, mytable As String

    Dim i As Integer

    mydata = "NorthWind"     '指定数据库名称

    mytable = "Orders"       '指定数据表名称

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

    Set myCat = New ADOX.Catalog

    myCat.ActiveConnection ="Provider=SQLOLEDB;" _

          & "User ID=sa;" _

          & "Password=11111;" _

          & "Data Source=THTFCOMPUTER;"_

          & "Initial Catalog="& mydata

    '将各个字段的有关信息复制到工作表

    Cells.Clear

    i = 2

    Range("A1:E1") = Array("索引名称", "是否主键", "是否唯一", "是否聚集", "指定字段")

    For Each myCol InmyCat.Tables(mytable).Indexes

        Range("A" & i) =myIdx.Name        '索引名称

        Range("B" & i) =myIdx.PrimaryKey         '是否主键

        Range("C" & i) =myIdx.Unique      '是否唯一

        Range("D" & i) =myIdx.Clustered    '是否聚集

        Range("E" & i) =myIdx.Columns(0)   '索引指定的字段

        i = i + 1

    Next

    Cells.Columns.AutoFit

    Set myCat = Nothing

    Set myCol = Nothing

End Sub