C# 错误:当传递带有修改行的DataRow集合时,更新需要有效的UpdateCommand
我使用分页在C# 错误:当传递带有修改行的DataRow集合时,更新需要有效的UpdateCommand,c#,.net,ado.net,dataadapter,C#,.net,Ado.net,Dataadapter,我使用分页在datagridview中显示数据,但当我尝试使用updatebutton更新任何数据时,数据应该在datagridview中以及数据库中更新 但我得到了这个错误: 传递数据行集合时,更新需要有效的UpdateCommand 使用修改的行 在这一行发生了什么: adp1.Update(dt);//here I am getting error 下面是代码 public partial class EditMediClgList : Form {
datagridview
中显示数据,但当我尝试使用updatebutton
更新任何数据时,数据应该在datagridview
中以及数据库中更新
但我得到了这个错误:
传递数据行集合时,更新需要有效的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);
OLEDB数据适配器
需要有效的更新
、插入、
删除
命令来保存数据,如下所示:
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建议的那样)。在此之后,我必须在designer视图中调出DataSet.xsd,右键单击可视化DataTable对象并选择configure。当TableAdapter配置向导打开时,我单击了“高级选项”按钮。我选中了生成插入、更新和删除语句复选框,然后单击OK并完成。在此之后(仍在设计器视图中),我选择了VisualTableAdapter对象,它为我提供了所有完整属性。SQL是自动生成的。我花了一段时间才找到这个,所以我希望它能帮助别人。多亏了“@Chris”,上面的代码对我很有用。 我需要指定更新时要更新的数据库表名。 您可以在此处阅读更多有关内容:
是的,您是对的,现在我没有收到错误,数据已更新,谢谢:)
// 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());
}