[ Team LiB ]
Recipe 10.14 Listing TablesinanAccessDatabase
Problem
You need a list of all tablesin your Access database.
Solution
Use the GetOLEDBSchemaTable( ) method of the OleDbConnection class or use ADOX
through COM interop.
The first technique uses the GetOLEDBSchemaTable( ) method to return schema
information about user tables. These results are then displayed.
For the second technique, you'll need a reference to the Primary Interop Assembly (PIA)
for ADO provided in the file ADODB.DLL; select adodb from the .NET tab in Visual
Studio .NET's Add Reference Dialog. You'll also need a reference to Microsoft ADO
Ext. 2.7 for DDL and Security from the COM tab in Visual Studio .NET's Add Reference
Dialog.
The second technique creates an ADOX Catalog object through COM interop. The
Tables property of this object accesses the collection of tables from which the name and
other information are displayed.
The C# code is shown in Example 10-14
.
Example 10-14. File: ListAccessTablesForm.cs
// Namespaces, variables, and constants
using System;
using System.Configuration;
using System.Text;
using System.Data;
using System.Data.OleDb;
// . . .
// OLE DB
StringBuilder result = new StringBuilder( );
// Open the OLE DB connection.
OleDbConnection conn = new OleDbConnection(
ConfigurationSettings.AppSettings["MsAccess_ConnectString"]);
conn.Open( );
// Retrieve schema information for all tables.
DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] {null, null, null, "TABLE"});
result.Append("TABLE" + Environment.NewLine);
// Iterate over the collection of table records.
foreach(DataRow row in schemaTable.Rows)
{
result.Append(row["TABLE_NAME"] + Environment.NewLine);
}
conn.Close( );
resultTextBox.Text = result.ToString( );
// ADOX
StringBuilder result = new StringBuilder( );
// Open the connection.
ADODB.Connection conn = new ADODB.ConnectionClass( );
conn.Open(ConfigurationSettings.AppSettings["MsAccess_ConnectString"],
"", "", 0);
// Create an ADOX catalog object for the connecton.
ADOX.Catalog cat = new ADOX.Catalog( );
cat.ActiveConnection = conn;
result.Append("TABLE\tKEY" + Environment.NewLine);
// Iterate over the collection of tables.
foreach(ADOX.Table table in cat.Tables)
{
if(table.Type == "TABLE")
{
result.Append(table.Name + Environment.NewLine);
// Iterate over the collection of keys for the table.
foreach(ADOX.Key key in table.Keys)
{
result.Append("\t" + key.Name + " (");
// Iterate over the collection of columns for the key.
foreach(ADOX.Column col in key.Columns)
{
result.Append(col.Name + ", ");
}
result.Remove(result.Length - 2, 2).Append(")" +
Environment.NewLine);
}
result.Append(Environment.NewLine);
}
}
cat = null;
conn.Close( );
resultTextBox.Text = result.ToString( );
Discussion
The solution shows two techniques that you can use to get a list of tables inanAccess
database.
The first technique uses the GetOleDbSchemaTable( ) method of the OLE DB connection
object. This technique is discussed in Recipe 10.2
.
The second technique uses ActiveX Database Objects Extensions (ADOX) from COM
interop. ADOX has a Tables property that exposes a collection of Table objects in the
database. The user tables are determined by iterating over the collection of tables and
selecting only those where Type property of the Table is TABLE.
The Table object also exposes collections of Columns, Indexes, Keys, and Properties that
can be used to further investigate the database. As an example, the sample code iterates
over the collection of Keys in each table to get the list of both primary and foreign keys.
[ Team LiB ]
. [ Team LiB ]
Recipe 10.14 Listing Tables in an Access Database
Problem
You need a list of all tables in your Access database.
Solution
Use the GetOLEDBSchemaTable(. ListAccessTablesForm.cs
// Namespaces, variables, and constants
using System;
using System.Configuration;
using System.Text;
using System.Data;
using