C# 是否可以从SQL Server获取数据表列表?

C# 是否可以从SQL Server获取数据表列表?,c#,sql,sql-server,database,datatable,C#,Sql,Sql Server,Database,Datatable,我正在尝试从SQL Server数据库中获取表列表。我想要的是数据表对象,而不仅仅是名称 到目前为止,我得到了: using (SqlConnection connection = new SqlConnection(Settings.Default.DatabaseString)) { List<DataTable> tables = new List<DataTable>(); connection.Open(); } 但是我想要更多的信息

我正在尝试从SQL Server数据库中获取表列表。我想要的是
数据表
对象,而不仅仅是
名称

到目前为止,我得到了:

using (SqlConnection connection = new SqlConnection(Settings.Default.DatabaseString))
{
   List<DataTable> tables = new List<DataTable>();
   connection.Open();       
}

但是我想要更多的信息,而不仅仅是我想要返回主键和外键等的表的名称。这可能吗?

SQL Server非常开放。您可以轻松创建将返回所需数据的查询

存在多个表来帮助您:

SELECT * FROM sys.tables
SELECT * FROM sys.columns
SELECT * FROM sys.indexes
SELECT * FROM sys.objects o WHERE o.type IN ('PK', 'F')

可以使用系统方法
OBJECT\u name

从这些表中的任何一个查询对象的名称。您可以通过重载获取有关数据库、表、列和索引的信息:

using (var con = new SqlConnection(Settings.Default.DatabaseString))
{
    con.Open();
    DataTable tables = con.GetSchema("Tables");
    foreach (DataRow tableRow in tables.Rows)
    {
        String database = tableRow.Field<String>("TABLE_CATALOG");
        String schema = tableRow.Field<String>("TABLE_SCHEMA");
        String tableName = tableRow.Field<String>("TABLE_NAME");
        String tableType = tableRow.Field<String>("TABLE_TYPE");
        DataTable columns = con.GetSchema("Columns", new[] { database, null, tableName });
        foreach (DataRow col in columns.Rows)
        {
            Console.WriteLine(string.Join(",",col.ItemArray));
        }
        DataTable indexes = con.GetSchema("Indexes", new[] { database, null, tableName });
        foreach (DataRow index in indexes.Rows)
        {
            Console.WriteLine(string.Join(",", index.ItemArray));
        }
        DataTable indexColumns = con.GetSchema("IndexColumns", new[] { database, null, tableName });
        foreach (DataRow indexCol in indexColumns.Rows)
        {
            Console.WriteLine(string.Join(",", indexCol.ItemArray));
        }
    }
}
使用(var-con=new-SqlConnection(Settings.Default.DatabaseString))
{
con.Open();
DataTables=con.GetSchema(“表”);
foreach(tables.Rows中的DataRow tableRow)
{
字符串数据库=tableRow.Field(“TABLE_目录”);
字符串模式=tableRow.Field(“TABLE_模式”);
字符串tableName=tableRow.Field(“TABLE_NAME”);
字符串tableType=tableRow.Field(“TABLE_TYPE”);
DataTable columns=con.GetSchema(“columns”,new[]{database,null,tableName});
foreach(columns.Rows中的DataRow列)
{
Console.WriteLine(string.Join(“,”,col.ItemArray));
}
DataTableIndexes=con.GetSchema(“indexes”,new[]{database,null,tableName});
foreach(index.Rows中的数据行索引)
{
WriteLine(string.Join(“,”,index.ItemArray));
}
DataTable indexColumns=con.GetSchema(“indexColumns”,new[]{database,null,tableName});
foreach(indexColumns.Rows中的DataRow indexCol)
{
WriteLine(string.Join(“,”,indexCol.ItemArray));
}
}
}
下面是
GetSchema
的可能值列表:


GetSchema还返回信息,前提是您传递了正确的“索引”集等。
GetSchema
返回1个数据表,每个
行包含4列,这些列给出了表的名称。有没有办法为数据库中的每个表获取一个
DataTable
对象?
using (var con = new SqlConnection(Settings.Default.DatabaseString))
{
    con.Open();
    DataTable tables = con.GetSchema("Tables");
    foreach (DataRow tableRow in tables.Rows)
    {
        String database = tableRow.Field<String>("TABLE_CATALOG");
        String schema = tableRow.Field<String>("TABLE_SCHEMA");
        String tableName = tableRow.Field<String>("TABLE_NAME");
        String tableType = tableRow.Field<String>("TABLE_TYPE");
        DataTable columns = con.GetSchema("Columns", new[] { database, null, tableName });
        foreach (DataRow col in columns.Rows)
        {
            Console.WriteLine(string.Join(",",col.ItemArray));
        }
        DataTable indexes = con.GetSchema("Indexes", new[] { database, null, tableName });
        foreach (DataRow index in indexes.Rows)
        {
            Console.WriteLine(string.Join(",", index.ItemArray));
        }
        DataTable indexColumns = con.GetSchema("IndexColumns", new[] { database, null, tableName });
        foreach (DataRow indexCol in indexColumns.Rows)
        {
            Console.WriteLine(string.Join(",", indexCol.ItemArray));
        }
    }
}