Заполнение DataGridView набором данных

#c# #database #winforms

#c# #База данных #winforms

Вопрос:

Я пытаюсь создать базу данных рецептов, которая берет ингредиенты у пользователя и выводит рецепты, содержащие указанные ингредиенты. Я пытаюсь заполнить представление таблицы данных результатами из инструкции sql, но я не получаю никаких результатов внутри моей сетки. Моя инструкция SQL верна. Вот мой код:

resultsWindow:

         private void resultsWindow_Load(object sender, EventArgs e)
    {
        //get connection string
        string connectionString = Properties.Settings.Default.ConnectionString;

        DataSet recipeDataSet = new DataSet();
        conn = new DatabaseConnections(connectionString);

        //Get dataset
        recipeDataSet = conn.getRecipes(ingredientArray);

        //Display data in grid view
        recipesDataGrid.DataSource = recipeDataSet.Tables[0];
    }
  

Окно подключения к базе данных:

         public DataSet getRecipes(string[] ingArray)
    {
        string sqlString = "SELECT recipes.Name, Instructions, recipes.Preperation_Time, Author FROM RecipeIngredients"  
                           " INNER JOIN recipes ON recipes.Recipe_ID = RecipeIngredients.Recipe_ID"  
                           " INNER JOIN Ingredients ON Ingredients.Ingredient_ID = RecipeIngredients.Ingredient_ID"  
                           " WHERE ingredients.Name = 'Eggs'";

        DataSet recipeDataSet = new DataSet();
        DataTable recipeDataTable = new DataTable();

        openConnection();

        dataAdapter = new SqlDataAdapter(sqlString, connectionToDB);

        //Fill dataset
        dataAdapter.Fill(recipeDataTable);
        recipeDataSet.Tables.Add(recipeDataTable);
        dataAdapter.Fill(recipeDataSet);

        closeConnection();

        return recipeDataSet;

    }
  

Это таблица данных, как только я запускаю программу

Заранее спасибо.

РЕДАКТИРОВАТЬ: я понял, что не работает не моя таблица / набор данных, но мой оператор SQL, похоже, ничего не возвращает, хотя, когда я отправляю это как отдельный запрос, я получаю результаты.

Комментарии:

1. Вы проверили recipeDataSet. В таблицах [0] есть данные?

2. Почему вы дважды заполняете dataset recipeDataSet это может привести к заполнению пустоты во второй раз, поэтому удалите эту строку => dataAdapter.Fill(recipeDataSet); и дайте мне знать 🙂

Ответ №1:

просто попробуйте .. я не уверен в этом

  private void resultsWindow_Load(object sender, EventArgs e)
    {
        //gets connection string
        string connectionString = Properties.Settings.Default.ConnectionString;

        DataSet recipeDataSet = new DataSet();
        conn = new DatabaseConnections(connectionString);

        //Gets dataset
        Datatable dt1 = conn.getRecipes(ingredientArray);

        //Displays data in grid view
    recipesDataGrid.DataSource = dt1.DefaultView;


    }


   public DataTable getRecipes(string[] ingArray)
{
    string sqlString = "SELECT recipes.Name, Instructions, recipes.Preperation_Time, Author FROM RecipeIngredients"  
                       " INNER JOIN recipes ON recipes.Recipe_ID = RecipeIngredients.Recipe_ID"  
                       " INNER JOIN Ingredients ON Ingredients.Ingredient_ID = RecipeIngredients.Ingredient_ID"  
                       " WHERE ingredients.Name = 'Eggs'";

    DataTable recipeDataTable = new DataTable();

    openConnection();

    dataAdapter = new SqlDataAdapter(sqlString, connectionToDB);

    //Fills dataset
    dataAdapter.Fill(recipeDataTable);
    closeConnection();

    return recipeDataTable;
  

Ответ №2:

Проблема здесь в том, что вы заполнили таблицу, добавили ее в нетипизированный набор данных, затем заполнили набор данных отдельно, что фактически должно привести к созданию нескольких таблиц в вашем наборе данных.
Либо заполните таблицу, ЛИБО набор данных, не оба. Обычно я просто заполняю набор данных.

Краткое содержание из IDbAdapter.Fill(DataSet) :
Добавляет или обновляет строки в System.Data.DataSet, чтобы они соответствовали строкам в источнике данных, используя имя System.Data.DataSet, и создает System.Data.DataTable с именем «Таблица».

Попробуйте сначала сократить свой код до этого:

 public DataSet getRecipes(string[] ingArray)
{
    string sqlString = "SELECT recipes.Name, Instructions, recipes.Preperation_Time, Author FROM RecipeIngredients"  
                       " INNER JOIN recipes ON recipes.Recipe_ID = RecipeIngredients.Recipe_ID"  
                       " INNER JOIN Ingredients ON Ingredients.Ingredient_ID = RecipeIngredients.Ingredient_ID"  
                       " WHERE ingredients.Name = 'Eggs'";

    DataSet recipeDataSet = new DataSet();

    openConnection();

    dataAdapter = new SqlDataAdapter(sqlString, connectionToDB);

    //Fill dataset will create a table with the results
    // so you only need this one line:
    dataAdapter.Fill(recipeDataSet);

    closeConnection();

    return recipeDataSet;

}
  

Вы также могли просто удалить строку:
dataAdapter.Fill(recipeDataSet);

Для дальнейшей проверки вашей логики отладьте это и установите точку останова в ResultsWindow_Load, проверьте результат recipeDataSet.Tables[0] перед установкой его в качестве источника данных, вы можете использовать инструменты проверки в VS для этого, установить наблюдение за переменной или использовать немедленную консоль…

 // Display data in grid view
// Inspect recipeDataSet.Tables[0], make sure there is only 1 table, and it has rows
if (recipeDataSet.Tables.Count() != 1)
    throw new ApplicationException("Expected only 1 table in the dataset");
if (recipeDataSet.Tables[0].Rows.Count() == 0)
    throw new ApplicationException("no rows found in the data table!");

recipesDataGrid.DataSource = recipeDataSet.Tables[0];
  

Если есть строки, а сетка по-прежнему не отображается, и данные, после настройки источника данных, вызовите recipesDataGrid.Refresh() , чтобы принудительно ее перерисовали, это может потребоваться, когда вы не используете контекстные менеджеры и не привязываете их.

Если строк нет

Если возвращенных строк нет, первое, что нужно проверить, это правильность ваших критериев фильтрации. Я предположу, что вы жестко запрограммировали предложение WHERE здесь в качестве примера, и это ingArray представляет собой массив ингредиентов для фильтрации.

Пожалуйста, обновите свой пост, включив пример вашей реализации ingredientArray в метод _load, и я смогу обновить этот код более полным ответом.

  1. Удалите предложение WHERE из строки SqlString (пока просто закомментируйте строку:

     string sqlString = "SELECT recipes.Name, Instructions, recipes.Preperation_Time, Author FROM RecipeIngredients"  
                   " INNER JOIN recipes ON recipes.Recipe_ID = RecipeIngredients.Recipe_ID"  
                   " INNER JOIN Ingredients ON Ingredients.Ingredient_ID = RecipeIngredients.Ingredient_ID";
      

    Если в вашей сетке теперь есть данные, значит, проблема была в критериях фильтрации.

  2. Проверьте строку подключения, убедитесь, что база данных, к которой обращается ваш код, является той же базой данных, в которой вы тестируете. Звучит просто, но легко совершить ошибку.

Комментарии:

1. Я использовал вашу debug и да, в datatable или наборе данных нет строк. Моя строка SQL работает, когда я запускаю запрос, и это должно быть результатом: imgur.com/oijNOed

2. Если ошибок нет, то мне придется поверить вам на слово, что верно следующее: 1. используемая здесь строка SqlString точно такая же, с которой вы тестируете напрямую, 2. строка подключения указывает на правильную базу данных..

3. Я внес изменения в свой ответ, если вы включите пример кода, который задает переменную ingredientArray, тогда я смогу включить более полный ответ.