更新命令和C#
本文关键字:命令 更新 | 更新日期: 2023-09-27 18:22:33
我正在用文本框中的新数据更新数据集行,然后尝试将其更新到我的数据库中。我一直收到这个错误:
当传递具有已修改行的DataRow集合时,Update需要有效的UpdateCommand。
如何修复此错误?
这是我的代码:
protected void Save_Butt_Click( object sender, EventArgs e ) {
OleDbConnection connect = new OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/PizzaOrders.mdb;Persist Security Info=True" );
//set up connection string
OleDbCommand command = new OleDbCommand("SELECT [title], [gname], [sname], [address], [suburb], [postcode], [dayphone], [email] FROM [users] WHERE ([username] = @username)", connect);
OleDbParameter param0 = new OleDbParameter("@username", OleDbType.VarChar);
param0.Value = HttpContext.Current.User.Identity.Name;
command.Parameters.Add(param0);
connect.Open();
OleDbDataAdapter da = new OleDbDataAdapter(command);
DataSet dset = new DataSet();
da.Fill(dset);
dset.Tables[0].Rows[0]["title"] = Title_DDL.Text;
dset.Tables[0].Rows[0]["gname"] = Fname_txt.Text;
dset.Tables[0].Rows[0]["sname"] = LN_txt.Text;
dset.Tables[0].Rows[0]["address"] = Address_txt.Text;
dset.Tables[0].Rows[0]["suburb"] = suburb_txt.Text;
dset.Tables[0].Rows[0]["postcode"] = Postcode_txt.Text;
dset.Tables[0].Rows[0]["dayphone"] = Phone_txt.Text;
dset.Tables[0].Rows[0]["email"] = Email_txt.Text;
da.Update(dset);
}
使用OleDbcommandBuilder
生成UpdateCommnand
:
OleDbDataAdapter da = new OleDbDataAdapter(command);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
但是您需要在SELECT
命令中包含主键,以便在update命令中包含要更新的行。
OleDbConnection connect = new OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/PizzaOrders.mdb;Persist Security Info=True" );
connect.Open();
//set up connection string
OleDbCommand command = new OleDbCommand("SELECT [ID], [title], [gname], [sname], [address], [suburb], [postcode], [dayphone], [email] FROM [users] WHERE ([username] = @username)", connect);
OleDbParameter param0 = new OleDbParameter("@username", OleDbType.VarChar);
param0.Value = HttpContext.Current.User.Identity.Name;
command.Parameters.Add(param0);
OleDbDataAdapter da = new OleDbDataAdapter(command);
DataSet dset = new DataSet();
da.Fill(dset);
dset.Tables[0].Rows[0]["title"] = Title_DDL.Text;
dset.Tables[0].Rows[0]["gname"] = Fname_txt.Text;
dset.Tables[0].Rows[0]["sname"] = LN_txt.Text;
dset.Tables[0].Rows[0]["address"] = Address_txt.Text;
dset.Tables[0].Rows[0]["suburb"] = suburb_txt.Text;
dset.Tables[0].Rows[0]["postcode"] = Postcode_txt.Text;
dset.Tables[0].Rows[0]["dayphone"] = Phone_txt.Text;
dset.Tables[0].Rows[0]["email"] = Email_txt.Text;
OleDbCommandBuilder builder = new OleDbCommandBuilder(ad);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
da.Update(dset);
connect.Close();
该异常意味着您正试图在没有主键的情况下更新表,因为我在您的OleDbCommand中添加了字段[ÍD]。如果其他字段是您的主键,请使用主键更改ID。当传递具有已修改行的DataRow集合时,Update需要有效的UpdateCommand。
所以我已经弄清楚了问题是什么。。。一个小时后,我发现在按钮点击事件运行之前页面已经被重新加载。因此,页面会用DB中未修改的文本更新屏幕,然后当它试图对行进行更新时。。。它发现没有任何字段被更改,因此没有修改数据。
urrgh!太令人沮丧了。。。我知道这将是一个简单的问题。。。我通过在页面上放置"获取详细信息"按钮来修复页面,这样page_load事件就不会覆盖用户输入叹息