最近在做一个代码生成工具,在制作的过程中,掌握了获取数据源的架构信息,获取数据源的架构信息是代码生成工具的基础。
获取数据源的架构信息,网上有不同的方法,但我觉得都太复杂了,其实在.Net上,要获取数据源的架构信息是件非常容易的事情,只要使用Connection对象的GetSchema方法就可以了。下面以SqlConnection为例,使用的是Northwind数据库。
DataTable table = connection.GetSchema();
以无参的形式调用GetSchema方法,此时将返回一个 DataTable,包含支持的架构集合列表和其它信息。
使用这些信息,可以通过GetSchema方法获取特定的集合。如Users获取数据库的所有用户,Procedures获取数据库的所有存储过程等等。
以Tables为例,当传入参数"Tables"(忽略大小写的)调用GetSchema方法时
DataTable table = connection.GetSchema("Tables");
得到的数据列信息为
可以看到,TABLE_TYPE有两种类型,BASE TABLE和VIEW,它把视图也当成是表(不过再想想,视图也确实属于表的一种)。
那么如何让它只返回表而包括视图呢?这时就要使用到GetSchema的第三个参数了。
第三个参数的用法有点特别,现在我需要返回的是TABLE_TYPE的值为BASE TABLE的集合。因为TABLE_TYPE是第4列(从1开始),那么就需要创建一个大小至少为4的string数组,然后把第4位的值赋值为"BASE TABLE"。
Code
string[] res = new string[4];
res[3] = "base table";
DataTable table = connection.GetSchema("Tables", res);
从得到的结果中可以看到,这次把视图过滤掉了。
下面是这个程序的完整代码:
Program
class Program
{
static void Main(string[] args)
{
SqlConnection connection = new SqlConnection();
connection.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\SQL Server 2000 Sample Databases\NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True";
connection.Open();
string[] res = new string[4];
res[3] = "base table";
DataTable table = connection.GetSchema("Tables", res);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
Console.Write(col.ColumnName + ":" + row[col] + "-");
}
Console.WriteLine();
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
foreach (DataColumn col in table.Columns)
{
foreach (DataRow row in table.Rows)
{
Console.WriteLine(col.ColumnName + ":" + row[col]);
}
Console.WriteLine();
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine();
foreach (DataColumn col in table.Columns)
{
Console.WriteLine(col.ColumnName);
}
connection.Close();
}
}