隨時抓出 Table 中的 Schema

我想很多人會想要隨時把資料庫裡面各資料表的 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」一文。


Dev 2Share @ 點部落