Как отобразить метаданные о таблицах SQL, которые получены из другой таблицы? - PullRequest
0 голосов
/ 14 февраля 2019

Итак, у меня есть база данных с 7 таблицами.Одна из этих таблиц, назовем ее tablesOfInterest, просто содержит строки других таблиц в базе данных.Эта таблица регулярно меняется.

Я пытаюсь сделать следующее:

  1. Получить имена таблиц из tablesOfInterest.
  2. Показать метаданные об этих таблицах.В частности, все имена столбцов и количество строк.

Я читал здесь Microsoft об использовании индекса строки [] для отображения метаданных о конкретных таблицах, но когда я запускаю свой текущий код, я получаю ошибку:

Было предоставлено больше ограничений, чем поддерживает запрашиваемая схема [таблицы].

Где я ошибаюсь?

Способ первый:

        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;
    }

Обновление:

Я попробовал предложения Майка, и это, безусловно, помогло!Теперь он отображает имена таблиц правильно.Однако он не отображает количество строк.Чтобы попытаться добиться этого, я сделал это:

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

В моем gridView я вижу только имена таблиц, как я могу также выбрать количество строк?

1 Ответ

0 голосов
/ 14 февраля 2019

Конкретная ошибка, которую вы получаете:

Было предоставлено больше ограничений, чем поддерживает запрашиваемая схема [таблицы].

связано с тем, что для коллекции Tables требуется3 ограничения: база данных, владелец и таблица.

Однако следующая проблема, с которой вы сталкиваетесь, даже если restrictions был определен как:

var restrictions = new string[3];

, этот код получит только схемудля последней таблицы в TablesOfInterest:

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>>();

, потому что вы восстанавливаете информацию столбца для нескольких таблиц.Это изменит эту итерацию на что-то вроде этого:

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());
    }
}
...