DataAdapter.Update()不更新数据库

我确信有一个非常简单的原因,这一行不起作用,但它已经避开过去一周,所以我希望别人会注意到我的错。

我这个项目已经工作了几个星期到一个月。 我一直在使用旧的DataAdapter,CommandBuiler等与1个数据库上的一些linq到sql编码的混合,具有多个Windows应用程序表单。 此特定表单使用DataAdapter,Dataset和Command Builder从数据库编辑或删除行。 它一直工作正常,直到我切换计算机。 现在数据集正在更新,但数据库不是。

以下是此表单的完整代码:

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 for Update是什么样的? 我看到命令,但我没有看到任何SqlText,这就是你所缺少的。

您需要通过在SqlDataAdapter上设置.UpdateCommand属性来定义.Updatefunction

这个链接提供了很好的细分方法: http : //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.updatecommand.aspx

你可能需要

 DataAdapeter.AcceptChanges() 

我遇到了同样的问题:用一些新行填充了一个新的数据集,但更新时没有任何反应。 我使用了类似的MySqlDataAdapter。

事实certificate,当您需要MySqlCommandBuilder中的InsertCommand时,您必须将rowstate指定为已添加。 另见: 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"); } 

}

请尝试以下来源。

 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"); } } 

在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); } 

我遇到了同样的问题。 我的dataadapter.fill工作但dataadapter.update不起作用。 我意识到问题是我的数据库表不包含主键。 在我修改我的表以包含带主键的列之后,dataadapter.fill工作。 希望这有助于某人。