今天有同事问我如何将access中的数据库结构导到文本中,方便查阅。说实话,这个问题我以前也遇见过,但总是太懒,没有想过写一段代码来实现这个功能。同事无意间的询问却让我想起“海洋木马2006”中有类似的功能,于是停止了病毒防火墙,打开这个木马,研究其代码,不想就走进了一个新的技术空间:ADODB.Connection.OpenSchema
以前紧紧知道Connection对象有execute和open两种方法,今天发现居然还有OpenSchema的方法,呵呵,使用WEB来管理数据库就靠它了。晚上花了一个半小时,终于成功得写出了代码。
顺便复制一篇文章供参考。
准备知识:
ADODB.Connection.OpenSchema方法:
语法:Set recordset = connection.OpenSchema (QueryType, Criteria, SchemaID)
说明: OpenSchema 方法返回有关数据源的自述信息,如数据源中包含的表、表中的列和支持的数据类型。
QueryType 参数是一个指示返回的列(模式)的 GUID。OLE DB 规范有一个完整的模式列表。
Criteria 参数限制模式查询的结果。Criteria 指定值的数组,这些值必须出现在结果 Recordset 中的列(称为“约束列”)的对应子集中。
如果提供者在上述列表中的范围以外定义自己的非标准模式查询,那么 QueryType 参数将使用 adSchemaProviderSpecific 常量。如果使用此常量,则要求用 SchemaID 参数来传递要执行的模式查询的 GUID。如果把 QueryType 设置为 adSchemaProviderSpecific 但未提供 SchemaID,将产生错误。
不要求提供者支持所有 OLE DB 标准模式查询。特别指出,OLE DB 规范只要求 adSchemaTables、adSchemaColumns 和 adSchemaProviderTypes。但并不要求提供者支持上面所列的模式查询的 Criteria 约束。
远程数据服务用法 OpenSchema 方法在客户端 Connection 对象上不可用。
注意 在 Visual Basic 中,包含从 Connection 对象 OpenSchema 方法返回的 Recordset 中的四字节无符号整数 (DBTYPE UI4) 的列不能与其他变量相比较。有关 OLE DB 数据类型的详细信息,请参阅 Microsoft OLE DB Programmer’s Reference 的 Chapter 13 和 Appendix A。
相关的SQL语句:http://blog.donews.com/ArEs/archive/2005/10/17/591709.aspx
Ø 实例:
Dim cnxn
Set cnxn=Server.CreateObject("ADODB.Connection")
Cnxn.Open yourConnectionString
’****************************
’显示所有的表
’****************************
Sub ShowTables()
On Error Resume next
CONST QueryType = 20 ’adSchemaTables
Set rstSchema = Cnxn.OpenSchema(QueryType)
Response.Write "<p><b>Table List</b></p>"
Response.Write "<ul>"
While Not rstSchema.EoF
If rstSchema("TABLE_TYPE") = "TABLE" Then ’显示用户创建的表
response.write "<li> " & rstSchema("TABLE_NAME") & "</li>"
End If
rstSchema.MoveNext
WEnd
Response.Write "</ul>"
rstSchema.Close
Set rstSchema = Nothing
If Err <> 0 Then
Response.write "ShowTables Error:" & Err.Source & "-->" & Err.Description
Err.Clear
End If
End Sub ’****ShowTables
’****************************
’显示指定表的所有列的属性
’****************************
Sub ShowColumns(tablename)
On Error Resume next
CONST QueryType = 4 ’adSchemaColumns
Dim Criteria
Criteria = Array(Empty,Empty,tablename,Empty)
Set rstSchema= Cnxn.OpenSchema(QueryType,Criteria)
Response.Write "<p><b>Property Of columns in " & tablename &"</b></p>"
Response.Write "<table>" &_
"<tr>"
For i=0 To rstSchema.fields.count-1
Response.Write "<td>" & rstSchema.fields(i).name & "</td>"
Next
Response.Write "</tr>"
While Not rstSchema.Eof
Response.Write "</tr>"
For i=0 To rstSchema.fields.count-1
Response.Write "<td>" & rstSchema.fields(i).value & "</td>"
Next
Response.Write "</tr>"
rstSchema.MoveNext
WEnd
Response.Write "</table>"
rstSchema.Close
Set rstSchema = Nothing
If Err <> 0 Then
Response.write "ShowColumns Error:" & Err.Source & "-->" & Err.Description
Err.Clear
End If
End Sub ’****ShowColumns
’****************************
’显示指定表的中的数据
’****************************
Sub ShowData(tablename)
On Error Resume next
response.write "<p align=center><b>Data In "&tablename&"</b><br>"
response.write "<table border=1 align=center>"
Set rs = cnxn.Execute("SELECT * FROM " & tablename)
response.write "<tr>"
For i = 0 To rs.fields.count-1
response.write "<td>" & rs.fields(i).name & "</td>"
Next
response.write "</tr>"
While Not rs.Eof
response.write "<tr>"
For i=0 To rs.fields.count-1
If VarType(rs(i)) = 8209 Then ’DataType=128
response.write "<td>" & "长二进制数据" & "</td>"
Else
response.write "<td>" & rs.fields(i).value & " </td>"
End If
Next
response.write "</tr>"
rs.MoveNext
Wend
response.write "</table>"
rs.Close
Set rs = Nothing
If Err <> 0 Then
Response.write "ShowData Error:" & Err.Source & "-->" & Err.Description
Err.Clear
End If
End Sub ’****ShowData
Tips:
结合SQL语句后就可以在WEB页面管理数据库了
修改ShowColumns中的QueryType值并将设置相应的Criteria值可实现其他功能:
比如QueryType = 28 (adSchemaPrimaryKeys)为显示主键信息
Criteria = Array(Empty,Empty,tablename)
QueryType = 12 (adSchemaIndexes)为索引信息
Criteria = Array(Empty,Empty,Empty,Empty,tablename)
请参考http://blog.donews.com/ArEs/archive/2005/10/17/591614.aspx中两者的对应
ShowColumns中有名为DATA_TYPE的一项取值请参考
http://blog.donews.com/ArEs/archive/2005/10/17/591758.aspx