DataAdapter.Update() не обновляет базу данных
Я уверен, что есть очень простая причина, что эта одна строка не работает, но на прошлой неделе она уклонилась, поэтому я надеюсь, что кто-то еще заметит мою ошибку.
Я работаю над этим проектом в течение нескольких недель и месяцев. Я использовал сочетание старого DataAdapter, CommandBuiler и т.д. С некоторым кодированием linq to sql в 1 базе данных с несколькими формами приложений Windows. Эта конкретная форма Редактирует или удаляет строки из базы данных с помощью DataAdapter, Dataset и Command Builder. Он работал нормально, пока я не переключил компьютеры. Теперь набор Dataset обновляется, но База данных не является.
Вот полный код этой формы:
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Exit Cook Book?", "Exit?", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
Application.Exit();
}
}
private void goBackToolStripMenuItem_Click(object sender, EventArgs e)
{
AddRecipe goBack = new AddRecipe();
Close();
goBack.Show();
}
private void helpToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Scan through the Cook Book to find recipes that you wish to edit or delete.", "Help!");
}
SqlConnection con;
SqlDataAdapter dataAdapt;
DataSet dataRecipe;
SqlCommandBuilder cb;
int MaxRows = 0;
int inc = 0;
private void EditRecipe_Load(object sender, EventArgs e)
{
con = new SqlConnection();
dataRecipe = new DataSet();
con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Recipes.mdf;Integrated Security=True;User Instance=True";
con.Open();
//MessageBox.Show("Database Open");
string sql = "SELECT* From CookBookRecipes";
dataAdapt = new SqlDataAdapter(sql, con);
dataAdapt.Fill(dataRecipe, "CookBookRecipes");
NavigateRecords();
MaxRows = dataRecipe.Tables["CookBookRecipes"].Rows.Count;
con.Close();
}
private void NavigateRecords()
{
DataRow dRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc];
tbRName.Text = dRow.ItemArray.GetValue(0).ToString();
listBox1.SelectedItem = dRow.ItemArray.GetValue(1).ToString();
tbRCreate.Text = dRow.ItemArray.GetValue(2).ToString();
tbRIngredient.Text = dRow.ItemArray.GetValue(3).ToString();
tbRPrep.Text = dRow.ItemArray.GetValue(4).ToString();
tbRCook.Text = dRow.ItemArray.GetValue(5).ToString();
tbRDirections.Text = dRow.ItemArray.GetValue(6).ToString();
tbRYield.Text = dRow.ItemArray.GetValue(7).ToString();
textBox1.Text = dRow.ItemArray.GetValue(8).ToString();
}
private void btnNext_Click(object sender, EventArgs e)
{
if (inc != MaxRows - 1)
{
inc++;
NavigateRecords();
}
else
{
MessageBox.Show("That the last recipe of your Cook Book!", "End");
}
}
private void btnBack_Click(object sender, EventArgs e)
{
if (inc > 0)
{
inc--;
NavigateRecords();
}
else
{
MessageBox.Show("This is the first recipe of your Cook Book!", "Start");
}
}
private void btnSave_Click(object sender, EventArgs e)
{
cb = new SqlCommandBuilder(dataAdapt);
DataRow daRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc];
daRow[0] = tbRName.Text;
daRow[1] = listBox1.SelectedItem.ToString();
daRow[2] = tbRCreate.Text;
daRow[3] = tbRIngredient.Text;
daRow[4] = tbRPrep.Text;
daRow[5] = tbRCook.Text;
daRow[6] = tbRDirections.Text;
daRow[7] = tbRYield.Text;
daRow[8] = textBox1.Text;
if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
dataAdapt.Update(dataRecipe, "CookBookRecipes");
MessageBox.Show("Recipe Updated", "Update");
}
}
private void btnDelete_Click(object sender, EventArgs e)
{
SqlCommandBuilder cb;
cb = new SqlCommandBuilder(dataAdapt);
if (MessageBox.Show("You wish to DELETE this recipe?", "Delete?", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
dataRecipe.Tables["CookBookRecipes"].Rows[inc].Delete();
MaxRows--;
inc = 0;
NavigateRecords();
dataAdapt.Update(dataRecipe, "CookBookRecipes");
MessageBox.Show("Your Recipe has been Deleted", "Delete");
}
}
Предполагается обновить таблицу:
dataAdapt.Update(dataRecipe, "CookBookRecipes");
Я не получаю никаких ошибок, но таблица данных просто не будет обновляться.
Заранее благодарим за помощь, и просто дайте мне знать, если вам нужна дополнительная информация.
Ответы
Ответ 1
Чтобы обновить данные в базе данных, вашему SqlDataAdapter необходимо установить свои свойства InsertCommand, UpdateCommand, DeleteCommand. Созданный вами экземпляр SqlCommandBuilder содержит эти команды, но вы должны установить их в свой SqlDataAdapter.
В других мирах: Где-то между
SqlCommandBuilder cb;
cb = new SqlCommandBuilder(dataAdapt);
и
dataAdapt.Update(dataRecipe, "CookBookRecipes");
вам нужно
dataAdapt.DeleteCommand = cb.GetDeleteCommand(true);
dataAdapt.UpdateCommand = cb.GetUpdateCommand(true);
dataAdapt.InsertCommand = cb.GetInsertCommand(true);
Ответ 2
Как выглядит SqlCommand
для обновления? Я вижу команду, но я не вижу ни одного SqlText, что вам не хватает.
Вам нужно определить, что делает .Update
, установив свойство .UpdateCommand
на SqlDataAdapter
Эта ссылка дает довольно хорошую информацию о том, как это сделать:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.updatecommand.aspx
Ответ 3
Добавление AcceptChangesDuringUpdate до обновления работает для меня, например:
foreach (string tableName in tableNames)
{
da = new SqlDataAdapter("SELECT * FROM " + tableName, cn);
cb = new SqlCommandBuilder(da); //initialise the update, insert and delete commands of da
da.AcceptChangesDuringUpdate = true;
da.Update(myDataSet, tableName);
}
Ответ 4
Возможно, вам понадобится
DataAdapeter.AcceptChanges()
Ответ 5
У меня была такая же проблема: добавлен новый набор данных с новыми строками, но ничего не произошло при обновлении. Я использовал MySqlDataAdapter, который работает аналогично.
Оказывается, когда вам понадобится InsertCommand из MySqlCommandBuilder, вам нужно указать rowstate как добавленное. См. Также: MSDN
Ответ 6
//change this line
DataRow daRow = dataRecipe.Tables["CookBookRecipes"].NewRow();
daRow[0] = tbRName.Text;
daRow[1] = listBox1.SelectedItem.ToString();
daRow[2] = tbRCreate.Text;
daRow[3] = tbRIngredient.Text;
daRow[4] = tbRPrep.Text;
daRow[5] = tbRCook.Text;
daRow[6] = tbRDirections.Text;
daRow[7] = tbRYield.Text;
daRow[8] = textBox1.Text;
if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
//add & change this too
dataRecipe.Tables["CookBookRecipes"].Rows.Add(daRow);
dataAdapt.Update(dataRecipe, "CookBookRecipes");
MessageBox.Show("Recipe Updated", "Update");
}
}
Ответ 7
Попробуйте использовать источник ниже.
private void btnSave_Click(object sender, EventArgs e)
{
cb = new SqlCommandBuilder(dataAdapt);
//Old source: DataRow daRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc];
//Added source code
DataRow daRow = dataRecipe.Tables["CookBookRecipes"].NewRow();
//Added source code
dataRecipe.Tables["CookBookRecipes"].AddRow(daRow);
daRow.BeginEdit();
daRow[0] = tbRName.Text;
daRow[1] = listBox1.SelectedItem.ToString();
daRow[2] = tbRCreate.Text;
daRow[3] = tbRIngredient.Text;
daRow[4] = tbRPrep.Text;
daRow[5] = tbRCook.Text;
daRow[6] = tbRDirections.Text;
daRow[7] = tbRYield.Text;
daRow[8] = textBox1.Text;
daRow.EndEdit();
//Reset state of rows to unchanged
dataRecipe.Tables["CookBookRecipes"].AcceptChanges();
//Set modified. The dataAdapt will call update stored procedured
//for the row that has Modifed row state.
//You can also try SetAdded() method for new row you want to insert
daRow.SetModified();
if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
dataAdapt.Update(dataRecipe, "CookBookRecipes");
MessageBox.Show("Recipe Updated", "Update");
}
}
Ответ 8
Я столкнулся с той же проблемой. Мой dataadapter.fill работает, но dataadapter.update не работает. Я понял, что проблема в том, что моя таблица базы данных не содержит первичного ключа. После того, как я изменил таблицу, чтобы включить столбец с первичным ключом, работает dataadapter.fill.
Надеюсь, это поможет кому-то.
Ответ 9
Проверьте свойства вашей базы данных, если вы используете Local-DB.
В свойстве "Копировать в выходной каталог" установите значение "Копировать, если новее", и все готово.