Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新命令和C_C#_Sql_Oledb - Fatal编程技术网

C# 更新命令和C

C# 更新命令和C,c#,sql,oledb,C#,Sql,Oledb,我正在用文本框中的新数据更新数据集行,然后尝试将其更新到我的数据库中。我不断地发现这个错误: 当传递带有修改行的DataRow集合时,更新需要有效的UpdateCommand 如何修复此错误 这是我的密码: protected void Save_Butt_Click( object sender, EventArgs e ) { OleDbConnection connect = new OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.

我正在用文本框中的新数据更新数据集行,然后尝试将其更新到我的数据库中。我不断地发现这个错误:

当传递带有修改行的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);
}
使用生成UpdateCommand的命令:

但是您需要在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集合时,更新需要有效的UpdateCommand。

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


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

DataAdapter不会生成SQL命令来操作数据库。您必须使用CommandBuilder生成这些命令:更好教程:现在我得到。。。OleDbCommand.Prepare方法要求所有可变长度参数具有显式设置的非零大小。因此,请将@username参数的大小设置为username列的大小。OleDbParameter param0=newOleDbParameter@username,OleDbType.VarChar,255;正当现在我没有收到任何错误,但是数据库中的数据没有更新。您是否已将表的主键添加到SELECT语句中?请注意,您也可以自己编写UpdateStatement,然后在DataAdapter上进行设置。但是您仍然需要一个主键来知道要更新哪一行。@user3684557这样尝试吗?@user3684557我多次告诉过您应该在select子句中添加ID。在您的示例中,它没有被添加,您是否在代码中执行此操作?用户名是我数据库用户表中的主要ID。例外情况相同?现在没有错误。但我的数据库没有变化。
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();