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数据库名称的查询记录集,然后再循环这个查询记录集中的每个记录,查看是否存在指定名称的数据库。
利用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
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
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
我们还可以利用存储过程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
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数据库中是否存在着与要创建的数据表同名的数据表。
我们可以利用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
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
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
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
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
rs.Close
Set rs = Nothing
End Function
我们还可以利用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 判断字段是否存在
在实际工作中,我们会碰到要往指定数据表中添加一个或数个新字段的情况,此时如果在数据表中已经存在了一个同名的字段,那么就会出现错误。同样,如果要删除数据表中不存在的字段也会出现错误。因此,在添加字段或删除字段之前,首先要判断在数据表中是否存在着与要添加字段同名的字段,或者判断在数据表中是否存在要删除的字段。
判断字段是否存在的方法有很多,下面我们介绍几种常用的方法。
利用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
将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
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是否为指定名称的数据表。
利用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-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数据库和数据表时,我们就已经为数据表创建了索引。但是,有些情况下我们需要在已有的数据表中创建新的索引。那么,为了能够成功创建索引,就需要先判断数据表中是否已经存在了指定名称的索引。
与判断数据表中字段是否存在的方法一样,判断数据表中是否存在索引的方法也有很多,下面我们介绍几种常用的方法。
利用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
将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
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是否为指定名称的数据表。
利用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服务器上所有的数据库清单
获取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
Cells.Columns.AutoFit
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
我们还可以利用存储过程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 获取指定数据库中所有的数据表信息清单
实际上,在前面介绍判断数据表是否存在时,就已经给出了获取指定数据库中所有的数据表清单的方法。下面介绍具体的方法和程序代码。
利用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’”
利用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
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
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
Cells.Columns.AutoFit
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
利用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 获取指定数据表中所有的字段信息清单
获取指定数据表中所有的字段信息清单,包括字段名称、数据类型、字段长度、字段默认值和是否允许空值等信息,有助于我们对数据表结构进行维护。实际上,在前面介绍判断字段是否存在时,就已经给出了获取指定数据表中所有的字段的方法。下面我们介绍具体的方法和程序代码。
利用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所示的结果(示例数据)。
利用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
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
Cells.Columns.AutoFit
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
利用数据表查询记录集对象获取指定数据表的全部字段信息清单的基本方法就是创建一个数据表的查询记录集,然后循环记录集的各个字段,获取各个字段的名称,数据类型和字段长度等信息。
【例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】中的数字含义是不一样的。
利用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 获取所有的索引清单
获取指定数据表中所有的索引信息清单,包括索引名称、对应字段等信息,与前面介绍判断索引是否存在的方法是基本相同的。
利用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为索引对应的字段名称。
利用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
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("A
"是否主键", "是否唯一", "是否聚集", "指定字段")
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
Cells.Columns.AutoFit
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
运行上面的程序,就得到如图3-6所示的结果(示例数据)。
利用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