获取表元数据时获取数据库模式

时间:2016-06-24 17:26:09

标签: c# sql-server

请注意,当我使用“schema”这个词时,我的意思是Schema作为Sql Server提供的安全功能(“dbo”...),如果你想要查询,你必须提供表名。成功,而不是它的元数据(列......)。

我正在使用这段代码来获取表元数据(列,类型等):

// Parameter table includes the schema name.
public DataTable GetTableSchema(string table)
{
    var tbl = new DataTable();
    using (var conn = new SqlConnection(ConnectionString))
    using (var adapter = new SqlDataAdapter(String.Format("SELECT * FROM {0} WHERE 1=0", table), conn))
    {
        tbl = adapter.FillSchema(tbl, SchemaType.Source);
    }    
    return tbl;
}

我的问题是属性DataTable.TableName不包含表架构(“dbo”或任何自定义架构),我在对象中找不到允许我获取该信息的任何属性,因此它在进程中丢失(或者我必须将几个变量传递给方法,而我想将所有内容保存在DataTable对象中,这应该是合乎逻辑的。)
我在哪里/如何将其与数据库结构一起使用?

我发现只有解决方案:在返回表格之前添加tbl.TableName = table;但感觉错误。

1 个答案:

答案 0 :(得分:3)

您可以查询INFORMATION_SCHEMA。TABLES视图并从TABLE_SCHEMA字段获取您的信息

 "SELECT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES where table_name = '" + table "'";

目前尚不清楚为什么需要此信息,因此我只建议运行此代码

SqlCommand cmd = new SqlCommand(@"SELECT TABLE_SCHEMA 
                                 FROM INFORMATION_SCHEMA.TABLES 
                                 WHERE TABLE_NAME = @table", con);
cmd.Parameters.Add("@table", SqlDbType.NVarChar).Value = table;
string schema = (string)cmd.ExecuteScalar();

还有一种替代方案,可以在一次调用中返回您桌面上的一些信息和table_schema

DataTable dt = new DataTable();
dt = cnn.GetSchema("COLUMNS", new string[] { null, null, table, null });
Console.WriteLine(dt.Rows[0]["TABLE_SCHEMA"].ToString());

此代码返回有关您的表以及TABLE_SCHEMA列的大量信息 不确定这种方法是否适合您的目的,因为此处返回的数据表包含每列的行,此DataTable的每列包含有关列的详细信息(如OrdinalPosition,IsNullable,DataType,Character_Maximum_Length)