#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, и я смогу обновить этот код более полным ответом.
-
Удалите предложение 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";
Если в вашей сетке теперь есть данные, значит, проблема была в критериях фильтрации.
-
Проверьте строку подключения, убедитесь, что база данных, к которой обращается ваш код, является той же базой данных, в которой вы тестируете. Звучит просто, но легко совершить ошибку.
Комментарии:
1. Я использовал вашу debug и да, в datatable или наборе данных нет строк. Моя строка SQL работает, когда я запускаю запрос, и это должно быть результатом: imgur.com/oijNOed
2. Если ошибок нет, то мне придется поверить вам на слово, что верно следующее: 1. используемая здесь строка SqlString точно такая же, с которой вы тестируете напрямую, 2. строка подключения указывает на правильную базу данных..
3. Я внес изменения в свой ответ, если вы включите пример кода, который задает переменную ingredientArray, тогда я смогу включить более полный ответ.