更新命令和 C#

Posted

技术标签:

【中文标题】更新命令和 C#【英文标题】:Update Command and C# 【发布时间】:2014-09-19 15:48:49 【问题描述】:

我正在使用文本框中的新数据更新数据集行,然后尝试将其更新到我的数据库。我不断收到此错误:

当传递带有修改行的 DataRow 集合时,更新需要有效的 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);

【问题讨论】:

DataAdapter 不会生成 SQL 命令来操作您的数据库。您必须使用 CommandBuilder 来生成这些命令:msdn.microsoft.com/en-us/library/tf579hcz(v=vs.110).aspx 更好的教程:csharp.net-informations.com/dataadapter/… 【参考方案1】:

使用OleDbcommandBuilder 生成UpdateCommnand

OleDbDataAdapter da = new OleDbDataAdapter(command);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);

但您需要在SELECT 命令中包含主键,以便更新命令更新哪些行。

【讨论】:

现在我明白了...“OleDbCommand.Prepare 方法要求所有可变长度参数都具有显式设置的非零大小。” 所以将@username 参数的大小设置为username 列的大小。 OleDbParameter param0 = new OleDbParameter("@username", OleDbType.VarChar, 255);对?现在我没有收到任何错误,但是数据库中的数据没有更新。 您是否将表的主键添加到您的 SELECT 语句中? 请注意,您也可以自己编写UpdateStatement,然后将其设置在DataAdapter 上。但是您仍然需要一个主键来知道要更新哪一行。【参考方案2】:
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 集合时,更新需要有效的 UpdateCommand。

【讨论】:

@user3684557 这样试试? @user3684557 我告诉过你很多次,你应该在 select 子句中添加 ID。在您的示例中未添加,您是否在代码中执行此操作? "username" 是我在数据库“user”表中的主 ID。 异常是一样的? 现在没有错误了。但是我的数据库没有任何变化。【参考方案3】:

所以我已经找出了问题所在......一个小时后,我发现在按钮单击事件运行之前页面正在重新加载。因此,页面将使用数据库中未修改的文本更新屏幕,然后当它尝试对行进行更新时......它发现没有任何字段被更改,因此它没有修改数据。

哎呀!太令人沮丧了...我知道这将是一个简单的问题...我通过在页面上放置“获取详细信息”按钮来修复页面,因此 page_load 事件不会覆盖用户输入。 叹息

【讨论】:

以上是关于更新命令和 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 命令从我的 DataTable 对象中使用 foreach-loop 更新 C# 中的 MS Access 数据库?

从命令行编译 C# 7.2 项目

来自 C# 的 SQL 无服务器命令

C#并行编程-并发集合

C# SQL 更新语句不更新

带有参数的 Oledb 更新命令在 access-db 上不起作用