1

我在 sql server 中有一个数据库,其中有几个表。

我需要填充一个列表框,其中包含来自数据库的表名列表,其中包含指定的列名 say 'special' 。

我试过类似的东西..

using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                List<string> tables = new List<string>();
                DataTable dt = connection.GetSchema("Tables");
                foreach (DataRow row in dt.Rows)
                {
                    string tablename = (string)row[2];
                    tables.Add(tablename);
                }
                listbox1.ItemsSource = tables;


                connection.Close();
            }

但它显示了数据库中存在的所有表..

但我只想要那些在列表中有特定列的表......

请建议我的方式... :)

4

3 回答 3

3

您可以使用此 linq 查询(现已测试):

List<string> tNames= new List<string>();  // fill it with some table names
List<string> columnNames = new List<string>() { "special" };
// ...

IEnumerable<DataRow> tableRows = con.GetSchema("Tables").AsEnumerable()
  .Where(r => tNames.Contains(r.Field<string>("TABLE_NAME"), StringComparer.OrdinalIgnoreCase));
foreach (DataRow tableRow in tableRows)
{
    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");
    IEnumerable<DataRow> columns = con.GetSchema("Columns", new[] { database, null, tableName }).AsEnumerable()
        .Where(r => columnNames.Contains(r.Field<string>("COLUMN_NAME"), StringComparer.OrdinalIgnoreCase));
    if (columns.Any())
    {
        tables.Add(tableName);
    }
}
于 2013-09-20T09:27:39.860 回答
3

恕我直言,您应该简单地查询 INFORMATION_SCHEMA.COLUMNS 表,而不是尝试过滤返回的模式。首先检索空洞模式以丢弃大部分数据是完全无效的。

SELECT c.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.COLUMN_NAME = 'YourLovelyColumnName'
于 2013-09-20T09:30:15.967 回答
0

假设您正在使用 SQL Server:

IF COL_LENGTH('table_name','column_name') IS NOT NULL
 BEGIN
 /*Column exists */
 END

看更多:

如何检查 SQL Server 表中是否存在列

于 2013-09-20T09:29:58.803 回答