Database Code
  Home arrow Database Code arrow Getting A List of Tables From SQL Server
Iron Speed
ASP Free Forums 
.NET  
ASP  
ASP Code  
ASP.NET  
ASP.NET Code  
BrainDump  
C#  
Code Examples  
Database  
Database Code  
IIS  
Microsoft Access  
MS SQL Server  
Visual Basic.NET  
Windows Scripting  
Windows Security  
XML  
ASP Web Hosting  
ASP.NET Web Hosting 
Dedicated Servers 
Download TestComplete 
Windows Web Hosting
 
IBM® developerWorks 
Weekly Newsletter
 
Developer Updates  
Free Website Content 
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Write For Us Get Paid 
Request Media Kit
Contact Us 
Site Map 
Privacy Policy 
Support 
 USERNAME
 
 PASSWORD
 
 
  >>> SIGN UP!  
  Lost Password? 
DATABASE CODE

Getting A List of Tables From SQL Server
By: Curtis_Swartzentruber
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 4 stars4 stars4 stars4 stars4 stars / 33
    2003-01-01

    Table of Contents:

    Rate this Article: Poor Best 
      ADD THIS ARTICLE TO:
      Del.ici.ous Digg
      Blink Simpy
      Google Spurl
      Y! MyWeb Furl
    Email Me Similar Content When Posted
    Add Developer Shed Article Feed To Your Site
    Email Article To Friend
    Print Version Of Article
    PDF Version Of Article
     
     
     
    ADVERTISEMENT

    Ajax Application Generator Generate database and reporting .NET Web apps in minutes. Quickly create visually stunning, feature-rich apps that are easy to customize and ready to deploy. Download Now!

    Description: It is often helpful to be able to query SQL Server to find out the schema for a certain database, including tables, information about columns in a particular table, the text of a stored procedure and so forth. This comes in handy when building applications ...


    Description:

    It is often helpful to be able to query SQL Server to find out the schema for a certain database, including tables, information about columns in a particular table, the text of a stored procedure and so forth. This comes in handy when building applications like code generators or query builders.

    The SQL-DMO Object Library was the main way to interface with SQL Server prior to the .NET Framework. This is still quite a useful COM object and can be used quite successfully from .NET using Interop. In fact, I built quite a nice code-generator using SQL-DMO to build my data access layer in ADO.NET.

    The .NET Framework itself provides some other ways to get at database schema. If using the SqlClient, you can query the INFORMATION_SCHEMA tables or use other methods like "sp_helptext". If using System.Data.OleDb, there is an interesting little class called OleDBSchemaGuid that lets us look at all sorts of interesting schema information. Not just in SQL Server either, but I'm going to focus on that since that's what I use.

    To illustrate, here is a very simple comparison using SQL-DMO and OleDBSchemaGuid to return a list of user tables from a database. The code is pretty simple, so I'll just show you the examples and you can run with it from there.

    I am using the Microsoft SQLDMO Object Library 8.0, which is the version that comes with SQL Server 2000. I have also used SQLDMO 7.0 to work with SQL Server 7 databases. This code uses the release version of the .NET Framework and Visual Studio .NET.

     

    Function Using SQLDMO

    Private Function LoadUserTables_DMO(ByVal strServer As String, _
                ByVal strUser As String, _
                ByVal strPwd As String, _
                ByVal strDatabase As String) As ArrayList

            Dim slTables As ArrayList = New ArrayList()
            Dim srv As SQLDMO._SQLServer
            srv = New SQLDMO.SQLServer()
            Try
                srv.Connect(strServer, strUser, strPwd)
                Dim db As SQLDMO.Database = CType(srv.Databases.Item(strDatabase), SQLDMO.Database)
                Dim tbl As SQLDMO.Table
                For Each tbl In db.Tables
                    If Not tbl.SystemObject Then
                        slTables.Add(tbl.Name)
                    End If
                Next
                srv.DisConnect()
                srv = Nothing
            Catch x As Exception
                lblMsg.Text = x.Message
                slTables = Nothing
            End Try

            Return slTables

        End Function

     

    Function Using OleDBSchemaGuid

    Private Function LoadUserTables_Schema(ByVal strServer As String, _
                    ByVal strUser As String, _
                    ByVal strPwd As String, _
                    ByVal strDatabase As String) As ArrayList

            Dim cnString As String
            Dim slTables As ArrayList = New ArrayList()

            cnString = "Provider=SQLOLEDB;Data Source=" & strServer & ";Initial " & _
                    "Catalog=" & strDatabase & ";" & _
                    "User ID=" & strUser & ";" & _
                    "Password=" & strPwd & ";"

            Dim cn As OleDbConnection = New OleDbConnection(cnString)
            Try
                cn.Open()
                Dim schemaTable As DataTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
                                                                             New Object() {Nothing, Nothing, Nothing, "TABLE"})
                cn.Close()
                Dim dr As DataRow

                For Each dr In schemaTable.Rows
                    slTables.Add(dr("TABLE_NAME"))
                Next
            Catch x As OleDbException
                lblMsg.Text = x.Message
                slTables = Nothing
            End Try

            Return slTables

        End Function

     

    I put together a little ASPX page to test. It is very simple and should be easy to follow.

     

    ASPX page

    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="TableList.aspx.vb" Inherits="Sandbox.TableList"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
        <HEAD>
            <title>TableList</title>
            <LINK href="Stylesheets/Common.css" type="text/css" rel="stylesheet">
            <meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">
            <meta content="Visual Basic 7.0" name="CODE_LANGUAGE">
            <meta content="JavaScript" name="vs_defaultClientScript">
            <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
        </HEAD>
        <body>
            <form id="Form1" method="post" runat="server">
                <asp:Label id="lblMsg" runat="server"></asp:Label>
                <p><asp:validationsummary id="valSum" runat="server" displaymode="BulletList" showsummary="True" showmessagebox="False" headertext="The following errors were found."></asp:validationsummary></p>
                <p><asp:textbox id="DBServer" runat="server"></asp:textbox>SQL Server to target
                    (ComputerName or IP Address)
                </p>
                <p><asp:textbox id="UserName" runat="server"></asp:textbox>UserName
                </p>
                <p><asp:textbox id="Password" runat="server"></asp:textbox>Password
                </p>
                <p><asp:textbox id="Database" runat="server"></asp:textbox>Database
                </p>
                <asp:Panel id="PanDropdowns" runat="server" visible="False">
                    <P>
                        <asp:dropdownlist id="DdlTables_DMO" runat="server"></asp:dropdownlist>List of
                        tables using DMO (Interop)
                    </P>
                    <P>
                        <asp:dropdownlist id="DdlTables_Schema" runat="server"></asp:dropdownlist>List
                        of tables using OleDBSchemaGuid Class
                    </P>
                </asp:Panel>
                <P><asp:button id="BtnLoad" onclick="BtnLoad_Click" runat="server" text="Get Table List"></asp:button></P>
                <asp:requiredfieldvalidator display="None" id="ValR_Server" runat="server" controltovalidate="DBServer" errormessage="Server is a required field."></asp:requiredfieldvalidator>
                <asp:requiredfieldvalidator display="None" id="ValR_Database" runat="server" controltovalidate="Database" errormessage="Database is a required field."></asp:requiredfieldvalidator>
                <asp:requiredfieldvalidator display="None" id="ValR_UserName" runat="server" controltovalidate="UserName" errormessage="UserName is a required field."></asp:requiredfieldvalidator>
                <asp:requiredfieldvalidator display="None" id="ValR_Password" runat="server" controltovalidate="Password" errormessage="Password is a required field."></asp:requiredfieldvalidator></form>
        </body>
    </HTML>

     

    Code Behind for page

    Option Strict On
    Option Explicit On

    Imports System
    Imports SQLDMO
    Imports System.Data
    Imports System.Data.OleDb

    Public Class TableList
         Inherits System.Web.UI.Page
         Protected WithEvents DBServer As System.Web.UI.WebControls.TextBox
         Protected WithEvents UserName As System.Web.UI.WebControls.TextBox
         Protected WithEvents Password As System.Web.UI.WebControls.TextBox
         Protected WithEvents Database As System.Web.UI.WebControls.TextBox
         Protected WithEvents DdlTables_DMO As System.Web.UI.WebControls.DropDownList
        Protected WithEvents DdlTables_Schema As System.Web.UI.WebControls.DropDownList
        Protected WithEvents valSum As System.Web.UI.WebControls.ValidationSummary
        Protected WithEvents ValR_Server As System.Web.UI.WebControls.RequiredFieldValidator
        Protected WithEvents ValR_Database As System.Web.UI.WebControls.RequiredFieldValidator
        Protected WithEvents ValR_UserName As System.Web.UI.WebControls.RequiredFieldValidator
        Protected WithEvents ValR_Password As System.Web.UI.WebControls.RequiredFieldValidator
         Protected WithEvents PanDropdowns As System.Web.UI.WebControls.Panel
        Protected WithEvents lblMsg As System.Web.UI.WebControls.Label
        Protected WithEvents BtnLoad As System.Web.UI.WebControls.Button


        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

        End Sub

         Protected Sub btnLoad_Click(ByVal sender As Object, ByVal e As EventArgs)

            Dim blnSuccess As Boolean

            Dim slTables As ArrayList = LoadUserTables_DMO(DBServer.Text, UserName.Text, _
                                       Password.Text, Database.Text)
            If Not (slTables Is Nothing) Then
                DdlTables_DMO.DataSource = slTables
                DdlTables_DMO.DataBind()
                blnSuccess = True
            End If

            Dim slTables2 As ArrayList = LoadUserTables_Schema(DBServer.Text, _
                                    UserName.Text, Password.Text, Database.Text)
            If Not (slTables2 Is Nothing) Then
                DdlTables_Schema.DataSource = slTables2
                DdlTables_Schema.DataBind()
                blnSuccess = True
            End If

            If blnSuccess Then
                PanDropdowns.Visible = True
            Else
                PanDropdowns.Visible = False
            End If

        End Sub

        Private Function LoadUserTables_DMO(ByVal strServer As String, _
                ByVal strUser As String, _
                ByVal strPwd As String, _
                ByVal strDatabase As String) As ArrayList

            Dim slTables As ArrayList = New ArrayList()
            Dim srv As SQLDMO._SQLServer
            srv = New SQLDMO.SQLServer()
            Try
                srv.Connect(strServer, strUser, strPwd)
                Dim db As SQLDMO.Database = CType(srv.Databases.Item(strDatabase), SQLDMO.Database)
                Dim tbl As SQLDMO.Table
                For Each tbl In db.Tables
                    If Not tbl.SystemObject Then
                        slTables.Add(tbl.Name)
                    End If
                Next
                srv.DisConnect()
                srv = Nothing
            Catch x As Exception
                lblMsg.Text = x.Message
                slTables = Nothing
            End Try

            Return slTables

        End Function

        Private Function LoadUserTables_Schema(ByVal strServer As String, _
                    ByVal strUser As String, _
                    ByVal strPwd As String, _
                    ByVal strDatabase As String) As ArrayList

            Dim cnString As String
            Dim slTables As ArrayList = New ArrayList()

            cnString = "Provider=SQLOLEDB;Data Source=" & strServer & ";Initial " & _
                    "Catalog=" & strDatabase & ";" & _
                    "User ID=" & strUser & ";" & _
                    "Password=" & strPwd & ";"

            Dim cn As OleDbConnection = New OleDbConnection(cnString)
            Try
                cn.Open()
                Dim schemaTable As DataTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
                                                                             New Object() {Nothing, Nothing, Nothing, "TABLE"})
                cn.Close()
                Dim dr As DataRow

                For Each dr In schemaTable.Rows
                    slTables.Add(dr("TABLE_NAME"))
                Next
            Catch x As OleDbException
                lblMsg.Text = x.Message
                slTables = Nothing
            End Try

            Return slTables

        End Function

    End Class


    DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware.

    More Database Code Articles
    More By Curtis_Swartzentruber

     

    IBM® developerWorks developerWorks - FREE Tools!


    Check out the new Jazz space on developerWorks

    <a href="http://zeus.developershed.com/shonuff.php?blackbird=3853&zoneid=442&source=&dest=http%3A%2F%2Fwww.ibm.com%2Fdeveloperworks%2Fspaces%2Fjazz%3FS_TACT%3D105AGY31%26S_CMP%3DDEVSHED&ismap="><img src="http://images.devshed.com/corp/img/news/jazz01.gif" alt="developerWorks Jazz space" align="left"></a>You've heard the buzz about Jazz... want to know more about it from a developer's perspective? Check out the Jazz space on developerWorks. This space is an up-to-date resource for developers, including technical information about Jazz and products built on Jazz, like Rational Team Concert Express. The Jazz space includes content from a wide variety of sources, including links, feeds, and comments from experts.
    FREE! Go There Now!


    NEW! IBM – Taking Web 2.0 to Work

    David Barnes, Lead Evangelist for IBM Emerging Internet Technologies will discuss aspects of Web 2.0 that bring value to corporations, academia, and government. He'll also discuss IBM's vision around Web 2.0, including the importance of remixability and consumability. The discussion will culminate with examples of various IBM Software Group solutions you can use to get ahead of the Web 2.0 adoption curve.
    FREE! Go There Now!


    NEW! Building a grid system using WS-Resource Transfer, Part 4: Using WS-RT for grid monitoring

    In this five-part "Building a grid system using WS-Resource Transfer" series, we look at the use of WS-Resource Transfer (WS-RT) in different areas of the grid environment -- from using it as a method for storing and recovering general information about grid-to-grid monitoring and management, and security. We also examine how WS-RT can be used for the distribution and division of work. In any grid, there is a huge amount of metadata about the grid that needs to be stored and distributed. Using WS-RT makes sharing the information, especially the precise information required by different systems in the grid, significantly easier. Here in Part 4, we look at both sides of the security session, both in terms of using WS-RT as an aid to the authorization process and at combining WS-Security with WS-RT for secure resource exchange.
    FREE! Go There Now!


    NEW! Demystifying the automation of custom controls: Part 2. A step-by-step example of using IBM Rational Functional Tester to automate custom controls

    This tutorial applies the concepts that were covered in the first part of this two-part series to a real-world example.
    FREE! Go There Now!


    NEW! Develop with Java and PHP technology on AIX Version 5.3, Part 6: Building the Java business application

    Set up a PHP Web interface for the Java(TM) business application using a database created in earlier in this series. The PHP Web interface collects information from users and sends the session data to the Java business application for processing and for a response.
    FREE! Go There Now!


    NEW! Evaluate IBM Lotus Sametime Standard V8.0

    Visit IBM developerWorks to download a free trial of the latest release of IBM Lotus Sametime Standard V8.0. Lotus Sametime Standard V8.0 is a platform for unified communications and collaboration that combines security features with an extensible, open solution including integrated Voice over IP, geographic location awareness, mobile clients, and a robust Business Partner community offering telephony and video integration.
    FREE! Go There Now!


    NEW! Expand the editing capabilities of OpenOffice with XSLT

    You might know that you can pull XML data into OpenOffice's spreadsheet program, Calc, but did you know that you can create a filter to make word-processing documents out of data stored as XML? This tutorial shows you how to use OpenOffice's import/export filters to open your XML data as though it's just a plain document. From there, users can edit the document much more naturally and then save it back to its native format. You can also use this feature to easily turn your documents into XML data.
    FREE! Go There Now!


    NEW! Krugle, developerWorks, and code search

    Ken Krugler, co-founder of code search company Krugle, and Laura Merling, vice president of Marketing and Business Development for Krugle, join to talk about the ins and outs of code search and what it means as a new feature for developerWorks users.
    FREE! Go There Now!


    NEW! Rational Build Forge Express eKit

    Rational Build Forge Express Edition is an automation framework that packages the latest enterprise-grade technologies into a reliable, flexible and robust configuration designed and priced specifically for small to midsize businesses. The new Rational Build Forge Express eKit provides you with valuable resources – including a case study, podcast, demo, and articles – to help you increase staff productivity, compress development cycles and deliver better software, fast.
    FREE! Go There Now!


    NEW! Rational Talks to You:Per Kroll on Rational Method Composer Plug-in customization

    Join this Rational Talks to You teleconference on December 11 at 1:00 pm ET to get tips on building your own plugins with Rational Method Composer. Get your questions answered!
    FREE! Go There Now!



    All FREE IBM® developerWorks Tools!

    DATABASE CODE ARTICLES

    - Deployment of the MobiLink Synchronization M...
    - MobiLink Synchronization Wizard in SQL Anywh...
    - Finding Matching Records in Data Access Pages
    - Using the AccessDataSource Control in VS 2005
    - A Closer Look at ADO.NET: The Command Object
    - A Closer Look at ADO.NET: The Connection Obj...
    - Using ADO to Communicate with the Database, ...
    - Code Snippets: Counting Records
    - Constraints In Microsoft SQL Server 2000
    - Multilingual entries into a DB and to be dis...
    - Getting A List of Tables From SQL Server
    - SQL Server Database Creator - .NET Version
    - ADO Recordset Paging
    - Two combos, one textbox example
    - Discussion & Listserv Module by Mike Eck...

     
    Accelerating Trading Partner Performance
     
    Competing on Analytics
     
    Cost Effective Scaling with Virtualization and Coyote Point Systems
     
    Five Checkpoints to Implementing IP Telephony
     
    Hosted Email Security: Staying Ahead of New Threats
     




    © 2003-2008 by Developer Shed. All rights reserved. DS Cluster 4 hosted by Hostway