C# - 如何显示从另一个 table 检索到的关于 sql table 的元数据?

C# - how to display metadata about sql tables that are retrieved from another table?

所以,我有一个包含 7 table 的数据库。这些 table 之一,我们称之为 tablesOfInterest,只包含数据库中其他 table 的行。这 table 定期更改。

我想做的是:

  1. tablesOfInterest 中检索 table 个名字。
  2. 显示有关这些 table 的元数据。具体来说,所有列名和行数。

我在这里 Microsoft 阅读了有关使用字符串 [] 索引显示有关特定 table 的元数据的信息,但是当我 运行 我当前的代码时,我收到错误:

More restrictions were provided than the requested schema [tables] supports.

我哪里错了?

方法一:

        public static List<string> GetTables() {

        SqlConnection sqlConnection = null;
        SqlCommand cmd = null;
        string sqlString;
        List<string> result = new List<string>();

        try
        {
            sqlConnection = DBConnection.GetSqlConnection();

            sqlString = "select * from TablesOfInterest";
            cmd = new SqlCommand(sqlString, sqlConnection);

            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                result.Add(reader.GetString(0));
            }
        }
        catch (SqlException e)
        {
            MessageBox.Show("SQL Error! \n" + e);
        }
        catch (Exception e)
        {
            MessageBox.Show("General Error! \n" + e);
        }
        finally
        {
            sqlConnection.Close();
        }
        return result;


    }

方法二:

 public static List<string> GetMetaDataTables()
    {
        SqlConnection con = null;
        List<string> result = new List<string>();
        String[] restrictions = new String[5];

        try
        {
            con = DBConnection.GetSqlConnection();

            foreach (string s in GetMetaData())
            {
                restrictions[2] = s;
            }

            DataTable schemaTable = con.GetSchema("Tables", restrictions);

            foreach (DataRow row in schemaTable.Rows)
            {
                result.Add(row[2].ToString());
            }
        }
        catch (SqlException e)
        {
            MessageBox.Show("Sql Error! \n " + e);
        }
        catch (Exception e)
        {
            MessageBox.Show("General Error! \n " + e);
        }
        finally
        {
            con.Close();
        }
        return result;
    }

更新:

我尝试了迈克的建议,这确实有帮助!它现在可以正确显示 table 的名称。但是它不显示行数。为了尝试实现这一目标,我这样做了:

dataGridView2.DataSource = Controller.GetMetaDataTables().Select(x => new { 
Value = x.Value, Name = x.Key }).ToList();

虽然在我的 gridView 中我只看到 table 名称,但我如何才能 select 看到行数?

您遇到的具体错误:

More restrictions were provided than the requested schema [tables] supports.

是因为 Tables 集合需要 3 限制:数据库、所有者和 table。

但是,即使 restrictions 定义为:

,您遇到的下一个问题也是
var restrictions = new string[3];

此代码只会检索 TablesOfInterest 中最后一个 table 的模式:

foreach (string s in GetMetaData())
{
    restrictions[2] = s;
}

DataTable schemaTable = con.GetSchema("Tables", restrictions);

foreach (DataRow row in schemaTable.Rows)
{
    result.Add(row[2].ToString());
}

那是因为对 GetSchema 的调用属于第一个 for 循环的迭代,如下所示:

foreach (string s in GetMetaData())
{
    restrictions[2] = s;

    DataTable schemaTable = con.GetSchema("Tables", restrictions);

    foreach (DataRow row in schemaTable.Rows)
    {
        result.Add(row[2].ToString());
    }
}

你遇到的下一个问题是 result 确实需要一个字典:

var result = new Dictionary<string, List<string>>();

因为您正在恢复多个 table 的列信息。这会将迭代更改为如下所示:

foreach (string s in GetMetaData())
{
    restrictions[2] = s;

    DataTable schemaTable = con.GetSchema("Tables", restrictions);

    result.Add(s, new List<string>());
    foreach (DataRow row in schemaTable.Rows)
    {
        result[s].Add(row[2].ToString());
    }
}