错误:传递具有修改行的DataRow集合时,Update需要有效的UpdateCommand

本文关键字:Update UpdateCommand 有效 集合 DataRow 修改 错误 | 更新日期: 2023-09-27 18:29:52

我使用分页来显示datagridview中的数据,但当我尝试用updatebutton更新任何数据时,应该在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());
            }
        }
}

错误:传递具有修改行的DataRow集合时,Update需要有效的UpdateCommand

您只使用Select命令创建了OleDbDataAdapter

adp1 = new OleDbDataAdapter(cmd1);

OleDbDataAdapter需要使用有效的UpdateInsert, 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所建议的)。在此之后,我必须在设计器视图中调出DataSe.xsd,右键单击可视化DataTable对象并选择configure。当TableAdapter配置向导打开时,我单击了"高级选项"按钮。我选中了Generate Insert、Update和Delete语句复选框,然后选中了OK和Finish。在此之后(仍在设计器视图中),我选择了可视化TableAdapter对象,该对象为我提供了所有完整的属性。SQL是自动生成的。我花了一段时间才找到这个,所以我希望它能帮助到别人。

感谢"Chris";上面的代码对我有效。我需要指定更新时将更新的数据库表名称。你可以在这里阅读更多信息:

DataAdapter:更新无法找到TableMapping[';Table';]或DataTable';表';

// This Adapter and Dataset are used for Populating my datagridview, 
// so I use them also when I need to Update the Datagridview
SqlDataAdapter kundeTlfAdapter;
DataSet kundeTlfDataSet; 
try
{
    SqlConnection connection = new SqlConnection("Data source=BG-1-PC''SQLEXPRESS; Database = Advokathuset; User Id = abc; Password = abc;");
    SqlCommand cmd1 = new SqlCommand("Select* From Kunde_Tlf", connection);
    SqlCommandBuilder builder = new SqlCommandBuilder(kundeTlfAdapter);
    kundeTlfAdapter.SelectCommand = cmd1; // cmd1 is your SELECT command
    kundeTlfAdapter.Update(kundeTlfDataSet, "Kunde_Tlf"); //I get eror here if I dont add the name of the table that needs Update "Kunde_Tlf"
}
catch (Exception err)
{
    MessageBox.Show(err.Message.ToString());
}