DataAdapter.Update()不更新数据库
本文关键字:更新 数据库 Update DataAdapter | 更新日期: 2023-09-27 18:03:40
我相信这一行不起作用的原因非常简单,但在过去的一周里它一直在逃避,所以我希望其他人会注意到我的错误。
我已经为这个项目工作了几个星期到一个月。我一直在使用旧的DataAdapter、CommandBuiler等,并在1个数据库上使用一些linq-to-sql编码,以及多个windows应用程序表单。此特定表单使用DataAdapter、数据集和命令生成器编辑或删除数据库中的行。它一直运行良好,直到我换了电脑。现在数据集正在更新,但数据库没有。
这是此表单的完整代码:
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's 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");
我没有收到任何错误,但数据表就是不会更新。
提前感谢您的帮助,如果您需要更多信息,请告诉我。
为了更新数据库上的数据,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);
更新的SqlCommand
是什么样子的?我看到了命令,但没有看到任何SqlText,这就是您所缺少的。
您需要通过在SqlDataAdapter
上设置.UpdateCommand
属性来定义.Update
的作用
这个链接提供了一个关于如何进行的非常好的分解:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.updatecommand.aspx
尝试以下源代码。
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");
}
}
在更新之前添加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);
}
您可能需要
DataAdapeter.AcceptChanges()
我遇到了同样的问题:用一些新行填充了一个新的数据集,但在更新时什么也没发生。我使用过MySqlDataAdapter,它的工作原理类似。
事实证明,当您需要MySqlCommandBuilder中的InsertCommand时,您必须将行状态指定为已添加。另请参阅:MSDN
//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");
}
}
我也遇到了同样的问题。我的dataadapter.fill工作,但dataadapteer.update不工作。我意识到问题是我的数据库表不包含主键。在我修改了我的表以包含一个带主键的列之后,dataadapter.fill就可以工作了。希望这能帮助到别人。
如果您使用的是本地数据库,请检查数据库的属性。
在"复制到输出目录"属性中,设置值"如果更新则复制",您就可以继续了。
如果您正在使用的数据库被添加到您的项目中;复制到输出目录";属性可以设置为"0";始终复制">
如果是,请尝试将其更改为";如果更新,则复制">
我从这里得到了这个解决方案。