C# - 如何显示从另一个 table 检索到的关于 sql table 的元数据?
C# - how to display metadata about sql tables that are retrieved from another table?
所以,我有一个包含 7 table 的数据库。这些 table 之一,我们称之为 tablesOfInterest
,只包含数据库中其他 table 的行。这 table 定期更改。
我想做的是:
- 从
tablesOfInterest
中检索 table 个名字。
- 显示有关这些 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());
}
}
所以,我有一个包含 7 table 的数据库。这些 table 之一,我们称之为 tablesOfInterest
,只包含数据库中其他 table 的行。这 table 定期更改。
我想做的是:
- 从
tablesOfInterest
中检索 table 个名字。 - 显示有关这些 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());
}
}