错误:在传递带有已修改行的DataRow集合时,Update需要有效的UpdateCommand
我正在使用Paging在datagridview
显示数据,但是当我尝试使用updatebutton
更新任何数据时,应该在datagridview
和数据库中更新datagridview
。
但我得到这个错误:
在传递带有已修改行的DataRow集合时,Update需要有效的UpdateCommand
发生在这一行:
adp1.Update(dt);//here I am getting error
以下是代码
public partial class EditMediClgList : Form { public EditMediClgList() { InitializeComponent(); try { con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"); con.Open(); } catch (Exception err) { MessageBox.Show("Error:" +err); } cmd1 = new OleDbCommand("Select * from MedicalColeges order by MedicalClgID", con); ds = new DataSet(); adp1 = new OleDbDataAdapter(cmd1); adp1.Fill(ds, "MedicalColeges"); dataGridView1.DataSource = ds; // Get total count of the pages; this.CalculateTotalPages(); // Load the first page of data; this.dataGridView1.DataSource = GetCurrentRecords(1, con); } private void CalculateTotalPages() { int rowCount = ds.Tables["MedicalColeges"].Rows.Count; this.TotalPage = rowCount / PageSize; if (rowCount % PageSize > 0) // if remainder is more than zero { this.TotalPage += 1; } } private DataTable GetCurrentRecords(int page, OleDbConnection con) { dt = new DataTable(); if (page == 1) { cmd2 = new OleDbCommand("Select TOP " + PageSize + " * from MedicalColeges ORDER BY MedicalClgID", con); // CurrentPageIndex++; } else { int PreviouspageLimit = (page - 1) * PageSize; cmd2 = new OleDbCommand("Select TOP " + PageSize + " * from MedicalColeges " + "WHERE MedicalClgID NOT IN " + "(Select TOP " + PreviouspageLimit + " MedicalClgID from MedicalColeges ORDER BY MedicalClgID) ", con); // + //"order by customerid", con); } try { // con.Open(); this.adp1.SelectCommand = cmd2; this.adp1.Fill(dt); txtPaging.Text = string.Format("page{0} of {1} pages", this.CurrentPageIndex, this.TotalPage); } finally { // con.Close(); } return dt; } private void button1_Click(object sender, EventArgs e) { try { adp1.Update(dt);//here I am getting error } catch (Exception err) { MessageBox.Show(err.Message.ToString()); } } }
您已使用Select
命令创建了OleDbDataAdapter
:
adp1 = new OleDbDataAdapter(cmd1);
OleDbDataAdapter
需要有效的Update
, Insert,
Delete
命令来保存数据,如下所示:
adp1.Update(dt);//here I am getting error
您只需要使用OleDbCommandBuilder
来为您生成命令:
adp1 = new OleDbDataAdapter(); adp1.SelectCommand = cmd1; // cmd1 is your SELECT command OleDbCommandBuilder cb = new OleDbCommandBuilder(adp1);
编辑
由于您在运行时更改了OleDbDataAdapter
的Select命令以进行分页,因此每次保存数据时都需要初始化:
private void button1_Click(object sender, EventArgs e) { try { adp1.SelectCommand = cmd1; // cmd1 is your SELECT command OleDbCommandBuilder cb = new OleDbCommandBuilder(adp1); adp1.Update(dt); //here I hope you won't get error :-) } catch (Exception err) { MessageBox.Show(err.Message.ToString()); } }
可能是您在表中缺少主键。 您需要确保在数据库表的列上设置主键。
我必须将我的(递增)索引列更改为我的表的主键 (如Eaint建议的那样)。 在此之后,我不得不在设计器视图中拉出DataSet.xsd,右键单击visual DataTable对象并选择configure。 打开TableAdapter配置向导后,我单击了“高级选项”按钮。 我选中了Generate Insert,Update和Delete语句复选框,然后单击OK和Finish。 在此之后(仍然在设计师视图中),我选择了可视的TableAdapter对象,它给了我所有的完整属性。 SQL是自动生成的。 花了一段时间让我跟踪这个,所以我希望它可以帮助别人。