【问题标题】:oledbcommand ExecuteNonQuery won't updateoledbcommand ExecuteNonQuery 不会更新
【发布时间】:2016-06-05 17:52:04
【问题描述】:

我有以下代码,它根据字符串字段和日期进行选择,如果它返回任何内容,那么它会尝试进行更新。选择返回一些东西,但是当我进行更新时,变量“受影响”设置为零,这可能是因为日期吗?当我检查它时,我的日期变量设置为(英国格式){02/06/2016 13:10:00},所以它确实有一个时间组件。

//  DateTime Md, string ht = these are set at this point

var conn = new OleDbConnection();
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\MyPath\\MyDb.accdb";
conn.Open();

var cmdSel = conn.CreateCommand();
cmdSel.CommandText = @"SELECT * FROM MyTable WHERE Md = @MD AND HT=@HT";
cmdSel.Parameters.AddWithValue("@MD", Md);
cmdSel.Parameters.AddWithValue("@HT", ht);

var da = new OleDbDataAdapter(cmdSel);
var ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
    var cmd = conn.CreateCommand();
    cmd.CommandText = @"UPDATE MyTable SET HS=@HS WHERE Md = @MD AND HT=@HT";
    cmd.Parameters.AddWithValue("@MD", Md);
    cmd.Parameters.AddWithValue("@HT", ht);
    cmd.Parameters.AddWithValue("@HS", hs);
    var affected = cmd.ExecuteNonQuery();
}

【问题讨论】:

  • 您的访问权限是否更新?添加值后,您的更新命令是什么样的?您的列类型是什么?
  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • 也可以使用using 语句自动处理你的连接和命令。

标签: c# ado.net oledb


【解决方案1】:

Access/OleDB 不使用命名参数,它们只是位置占位符。因此,您必须按照 SQL 中列出的确切顺序提供参数值。带有其他推荐修复的代码将类似于:

string sql = @"UPDATE MyTable SET HS=@HS WHERE Md = @MD AND HT=@HT";

using (OleDbConnection dbcon = new OleDbConnection(AceConnStr))
{ 
    // other code
    using (OleDbCommand cmd = new OleDbCommand(sql, dbcon))
    { 
        // add in the same order as in SQL
        // I have no idea that these are
        cmd.Parameters.Add("@HS", OleDbType.VarChar).Value = Hs;
        cmd.Parameters.Add("@MD", OleDbType.Date).Value = Md;
        cmd.Parameters.Add("@HT", OleDbType.Integer).Value = Ht;
        int rows = cmd.ExecuteNonQuery();

    }   // closes and disposes of connection and command objects
}

不处理应该看到的东西的结果in this question 用户在尝试手动插入循环时用尽了资源。

您也不需要创建DataAdapter(或DataSet)来填充表格'您可以使用DataReader 来做同样的事情。

myDT.Load(cmd.ExecuteReader());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多