Заполнение dataGridView набором данных - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь создать базу данных рецептов, которая берет ингредиенты от пользователя и выводит рецепты, содержащие эти ингредиенты. Я пытаюсь заполнить представление сетки данных результатами из оператора 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;

    }

Это сетка данных после запуска программы

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

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

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

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

 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
        Datatable dt1 = conn.getRecipes(ingredientArray);

        //Display 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);

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

    return recipeDataTable;
0 голосов
/ 23 марта 2019

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

Сводка из 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. Проверьте строку подключения, убедитесь, что база данных, к которой обращается ваш кодэто та же база данных, в которой вы тестируете. Звучит просто, но легко допустить ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...