You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

参数化SQL执行ExecuteNonQuery()返回0,直接写值正常,求排查

问题根源及解决方案

核心问题1:参数值手动添加了多余单引号

参数化查询不需要手动为参数值套单引号,OleDb会自动根据字段类型处理值的格式与转义。你的代码中给@pid、@pWBSID、@pProjectID的参数值加了单引号,导致数据库实际匹配的是带单引号的字符串:

  • 比如@pid传"'79'",数据库会查找ID等于字符串'79'(包含单引号)的记录,但ID字段应为数值类型,自然找不到匹配行,更新结果为0。
  • @pWBSID和@pProjectID带单引号的参数值,也会导致字段值与预期的无引号字符串不匹配。

核心问题2:OleDb参数绑定按顺序而非名称

OleDb不支持命名参数匹配,会严格按照SQL语句中参数出现的顺序绑定你添加的参数。你的SQL语句参数顺序是@pWBSID→@pProjectID→@pFridayWorkHours→@pid,但添加参数的顺序是@pid→@pWBSID→@pProjectID→@pFridayWorkHours,顺序完全颠倒,导致参数值被错误绑定到对应字段,进一步加剧匹配失败。

修正后的代码

try
{
    using (var con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + Server.MapPath("/App_Data/assets/DB.accdb") + "; Persist Security Info=False"))
    {
        con.Open();

        string query = "UPDATE tblTimeSheetDataTemp SET WBSID = @pWBSID, ProjectID = @pProjectID, FridayWorkHours = @pFridayWorkHours WHERE ID = @pid";

        OleDbCommand sqlCmd = new OleDbCommand(query, con);

        // 严格按SQL语句中参数出现的顺序添加,且不要加单引号
        sqlCmd.Parameters.AddWithValue("@pWBSID", "020501");
        sqlCmd.Parameters.AddWithValue("@pProjectID", "20232001");
        sqlCmd.Parameters.AddWithValue("@pFridayWorkHours", 1); // 若为数值类型直接传int,不用字符串
        sqlCmd.Parameters.AddWithValue("@pid", 79); // ID是数值类型,直接传int值

        int rowsAffected = sqlCmd.ExecuteNonQuery();
        // using块会自动释放连接,无需手动调用con.Close()

        timesheetID.EditIndex = -1;
        populategridview();

        lblsucess.Text = "Selected Record Updated";
        Lblerror.Text = "";
    }
}
catch (Exception ex)
{
    lblsucess.Text = "";
    Lblerror.Text = ex.Message;
}

额外优化建议

  • 无需手动调用con.Close(),using块会在代码执行完毕后自动释放连接资源。
  • 针对数值类型的字段(比如FridayWorkHours、ID),直接传递对应数值类型的值,避免不必要的类型转换。

内容的提问来源于stack exchange,提问作者AryA Ahang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:32:57