我想很多人會想要隨時把資料庫裡面各資料表的 Schema 列印出來,或是放到文件裡面。我不知道其他人都是怎麼做的;或許需要用到什麼軟體。我自己則是習慣寫一個簡單的程式把它列出來。原理很簡單,只需使用 DataReader.GetSchemaTable 方法即可...
我想很多人會想要隨時把資料庫裡面各資料表的 Schema 列印出來,或是放到文件裡面。我不知道其他人都是怎麼做的;或許需要用到什麼軟體。我自己則是習慣寫一個簡單的程式把它列出來。原理很簡單,只需使用 DataReader.GetSchemaTable 方法即可。
以下是我的原始檔,可以直接使用。程式中的 ph 只是一個網頁中的 PlaceHolder 控制項。
Dim gv As New GridView
gv.AutoGenerateColumns = False
Dim ColumnNameField As New BoundField
ColumnNameField.DataField = "ColumnName"
ColumnNameField.HeaderText = "Column Name"
gv.Columns.Add(ColumnNameField)
Dim DataTypeNameField As New BoundField
DataTypeNameField.DataField = "DataTypeName"
DataTypeNameField.HeaderText = "Data Type Name"
gv.Columns.Add(DataTypeNameField)
Dim ColumnSizeField As New BoundField
ColumnSizeField.DataField = "ColumnSize"
ColumnSizeField.HeaderText = "Column Size"
gv.Columns.Add(ColumnSizeField)
Dim AllowDBNullField As New BoundField
AllowDBNullField.DataField = "AllowDBNull"
AllowDBNullField.HeaderText = "Allow DBNull"
gv.Columns.Add(AllowDBNullField)
ph.Controls.Add(gv)Dim connString As String = ConfigurationManager.ConnectionStrings("dbConnectionString1").ToString
Dim conn As New SqlConnection(connString)
Dim cmd As New SqlCommand
cmd.Connection = conn
cmd.CommandText = "SELECT * FROM Products"Try
conn.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.Default)
If dr.Read() Then
gv.DataSource = dr.GetSchemaTable
gv.DataBind()
End If
Catch ex As Exception
MsgBox("Data read error: " & ex.Message)
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
End If
End Try
在使用時,你只需把 Connection String 和資料表名稱改一改就可以用了。事實上使用 DataReader.GetSchemaTable 可以取出資料表中不同的屬性,不只 ColumnName, ColumnSize 等等而已。你也可以自己把 gv.AutoGenerateColumns 改成 True 以看到完整的列表。
以下是 GetSchemaTable 類別的說明: http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable(VS.71).aspx
如果要列出某一資料庫中的所有資料表,可以使用以下的程式:
Protected Sub BindDll()
Dim conn As New SqlConnection(connString)
Try
conn.Open()
ddlTbl.Items.Clear()
Dim dt As New DataTable
dt = conn.GetSchema("Tables")
Dim dv As DataView = dt.DefaultView
dv.Sort = "TABLE_NAME"
ddlTbl.DataSource = dv
ddlTbl.DataTextField = "TABLE_NAME"
ddlTbl.DataBind()
ddlTbl.Items.Insert(0, "請選擇一個資料表")
Catch ex As Exception
MsgBox("Data read error in BindDll(): " & ex.Message)
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
End If
End Try
End Sub
在上述程式中 ddlTbl 只是一個空白的 DropDownList 而已。
此外,我已經針對這項功能開發了一個 ADO.NET 的 Code Generator, 請參考「[ADO.NET] 讀取 SQL 表格以列出 Schema 並自動產生 ADO.NET 程式碼與 Stored」一文。