Generate A Data Dictionary Using ASP.NET

I hate having to open SQL Server or Microsoft Access just to look up a table or column name. Therefore I usually print out a data dictionary for future reference. Of course, I could just use Server Explorer in Visual Studio but I am not in the habit of using that (possibly because Server Explorer is not descriptive of what it actually does).

I've been referring to my data dictionaries as "database design" but I've checked Wikipedia and I guess database schema would be a better term for your data model and data dictionary is the correct term for documentation. I know phpMyAdmin allows you to generate this kind of information about your database and phpMyAdmin calls it a data dictionary.

Anyway, here is the ASP.NET code I use to generate my data dictionaries. The only interesting thing about the code is that it dynamically generates datagrids for each table.

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="data_dictionary.aspx.vb" Inherits="data_dictionary"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>Data Dictionary</title>
        <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
        <meta name="author" content="Robert S. Robbins">
    </HEAD>
    <body bgcolor="#FFFFFF">
        <h1 style="font-family:Arial;">Data Dictionary</h1>
        <hr noshade color="#000000">
        <font face="Arial">The purpose of this script is to document the database schema.</font>
        <br><br>
        <form id="Form1" method="post" runat="server">
        <asp:panel id="pnlErrorMessage" Visible="False" Runat="server">
            <BR>
            <asp:Label id="lblErrorMessage" Runat="server" Visible="False" ForeColor="#cc0000" Font-Name="Arial"></asp:Label>
        </asp:panel>
        </form>
    </body>
</HTML>

Imports System.Data.SqlClient
Imports System.Data
Imports System.Drawing

Public Class data_dictionary
    Inherits System.Web.UI.Page

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub
    Protected WithEvents lblErrorMessage As System.Web.UI.WebControls.Label
    Protected WithEvents pnlErrorMessage As System.Web.UI.WebControls.Panel

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
        Try
            'Create a connection string
            Dim connString As String
            connString = ConfigurationSettings.AppSettings("ConnectionString")

            'Open a connection
            Dim objConnection As New SqlConnection
            objConnection.ConnectionString = connString
            objConnection.Open()

            'Specify the SQL string
            Dim strSQL As String = "SELECT table_name FROM information_schema.tables " & _
		"WHERE table_catalog = 'YOUR_DATABASE_NAME_HERE' " & _
		"AND NOT table_name = 'dtproperties' " & _
		"AND NOT table_name = 'sysconstraints' " & _
		"AND NOT table_name = 'syssegments' " & _
		"ORDER BY table_name;"
            Dim objCmd As IDbCommand = objConnection.CreateCommand()
            objCmd.CommandText = strSQL
            Dim objReader As IDataReader = objCmd.ExecuteReader()

            Do While objReader.Read()
                CreateGrid(objReader("table_name").ToString())
            Loop

            objReader.Close()
	    objConnection.Close()

        Catch ex As Exception
            pnlErrorMessage.Visible = True
            lblErrorMessage.Text = ex.Message & "<br>Error loading data from database."
            lblErrorMessage.Visible = True
        End Try
    End Sub
    Public Sub CreateGrid(ByVal table_name As String)
        Dim DataGrid1 As New DataGrid
        Dim DataGridSpacer As New System.Web.UI.WebControls.Panel
        Dim DataGridHeader As New System.Web.UI.WebControls.Label

        DataGrid1.ShowHeader = True
        DataGrid1.AutoGenerateColumns = False
        DataGrid1.CellPadding = 3
        DataGrid1.HeaderStyle.Font.Bold = True
        DataGrid1.HeaderStyle.Font.Name = "Arial"
        DataGrid1.HeaderStyle.Font.Size = FontUnit.Point(10)
        DataGrid1.HeaderStyle.BackColor = ColorTranslator.FromHtml("#ECECEC")
        DataGrid1.ItemStyle.Font.Name = "Arial"
        DataGrid1.ItemStyle.Font.Size = FontUnit.Point(10)

        DataGridSpacer.Height = System.Web.UI.WebControls.Unit.Pixel(20)
        DataGridHeader.Text = table_name
        DataGridHeader.Font.Bold = True
        DataGridHeader.Font.Name = "Arial"
        DataGridHeader.Font.Size = FontUnit.Point(10)

        Dim datagridcol_1 As New BoundColumn
        datagridcol_1.HeaderText = "column_name"
        datagridcol_1.DataField = "column_name"
        DataGrid1.Columns.Add(datagridcol_1)

        Dim datagridcol_2 As New BoundColumn
        datagridcol_2.HeaderText = "data_type"
        datagridcol_2.DataField = "data_type"
        DataGrid1.Columns.Add(datagridcol_2)

        Dim datagridcol_3 As New BoundColumn
        datagridcol_3.HeaderText = "numeric_precision"
        datagridcol_3.DataField = "numeric_precision"
        DataGrid1.Columns.Add(datagridcol_3)

        Dim datagridcol_4 As New BoundColumn
        datagridcol_4.HeaderText = "character_maximum_length"
        datagridcol_4.DataField = "character_maximum_length"
        DataGrid1.Columns.Add(datagridcol_4)

        Dim datagridcol_5 As New BoundColumn
        datagridcol_5.HeaderText = "is_nullable"
        datagridcol_5.DataField = "is_nullable"
        DataGrid1.Columns.Add(datagridcol_5)

        Dim datagridcol_6 As New BoundColumn
        datagridcol_6.HeaderText = "column_default"
        datagridcol_6.DataField = "column_default"
        DataGrid1.Columns.Add(datagridcol_6)

        Try
            'Create a connection string
            Dim connString As String
            connString = ConfigurationSettings.AppSettings("ConnectionString")

            'Open a connection
            Dim objConnection As New SqlConnection
            objConnection.ConnectionString = connString
            objConnection.Open()

            'Specify the SQL string
            Dim strSQL As String = "SELECT column_name, data_type, numeric_precision, character_maximum_length,is_nullable, column_default FROM information_schema.columns WHERE table_name = '" & Trim(table_name) & "';"
            Dim objCmd As IDbCommand = objConnection.CreateCommand()
            objCmd.CommandText = strSQL
            Dim adapter As New SqlDataAdapter(objCmd)
            Dim rs As New DataSet
            adapter.Fill(rs)

            DataGrid1.DataSource = rs
            DataGrid1.DataBind()

            Page.Controls(1).Controls.Add(DataGridSpacer)
            Page.Controls(1).Controls.Add(DataGridHeader)
            Page.Controls(1).Controls.Add(DataGrid1)

	    objConnection.Close()

        Catch ex As Exception
            pnlErrorMessage.Visible = True
            lblErrorMessage.Text = ex.Message & "<br>Error loading data from database."
            lblErrorMessage.Visible = True
        End Try

    End Sub
End Class

9 Comments

Comments have been disabled for this content.