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 developerWorks - FREE Tools! | <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!
| | | | 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!
| | | | 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!
| | | | 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!
| | | | 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!
| | | | 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!
| | | | 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!
| | | | 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!
| | | | 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!
| | | | 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! | |