更新语句 C# Microsoft Access 中没有为一个或多个必需参数提供值

No Value given for one or more required Parameters in Update Statement C# Microsoft Access

我不断收到此错误并检查了很多次以确保一切是否 correct.I 认为我所做的一切都是正确的。不确定问题出在哪里。如果有人可以帮助我解决这个问题,将不胜感激。

_query = string.Format("UPDATE tblFormOQ SET UINumWorkers1 = {0},UINumWorkers2 = {1}, UINumWorkers3 = {2}, UISubjectWages = {3}, UIExcessWages= {4}, UITaxRate = {5}, UIPrepaid = {6}, UIPenalty = {7}, SWTSubjectWages = {8}, SWTax = {9}, SWTPrepaid = {10}, SWTMonth1 = {11}, SWTMonth2 = {12}, SWTMonth3 = {13}, TriMetSubjectWages = {14}, TriMetPrepaid = {15}, LaneSubjectWages = {16}, LanePrepaid = {17}, WCHours = {18}, WCPrepaid = {19} WHERE BusinessID = '{20}' and Year = '{21}' and Quarter = {22}", _UINumWorkers1, _UINumWorkers2, _UINumWorkers3, _UISubjectWages, _UIExcessWages, _UITaxRate, _UIPrepaid, _UIPenalty, _SWTSubjectWages, _SWTax, _SWTPrepaid, _SWTMonth1, _SWTMonth2, _SWTMonth3, _TriMetSubjectWages,_TriMetPrepaid , _LaneSubjectWages, _LanePrepaid, _WCHours, _WCPrepaid, _Businessid, _Year, _Quarter);

你有两个问题:

首先,Year 是 Access SQL 中的保留字,因此您需要将其括在方括号中才能将其用作列名。

此外,您正在使用 "dynamic SQL" 来构建您的命令,因此如果您的数据包含特殊字符(或者如果您忘记了分隔符,这里似乎就是这种情况),它可能会中断。您真的应该使用 参数化查询 ,像这样

using (OleDbCommand cmd = new OleDbCommand())
{
    cmd.Connection = conn;
    cmd.CommandText = "UPDATE tblFormOQ SET UINumWorkers1 = ?,UINumWorkers2 = ?, UINumWorkers3 = ?, UISubjectWages = ?, UIExcessWages= ?, UITaxRate = ?, UIPrepaid = ?, UIPenalty = ?, SWTSubjectWages = ?, SWTax = ?, SWTPrepaid = ?, SWTMonth1 = ?, SWTMonth2 = ?, SWTMonth3 = ?, TriMetSubjectWages = ?, TriMetPrepaid = ?, LaneSubjectWages = ?, LanePrepaid = ?, WCHours = ?, WCPrepaid = ? WHERE BusinessID = ? and [Year] = ? and Quarter = ?";
    cmd.Parameters.AddWithValue("?", _UINumWorkers1);
    cmd.Parameters.AddWithValue("?", _UINumWorkers2);
    cmd.Parameters.AddWithValue("?", _UINumWorkers3);
    cmd.Parameters.AddWithValue("?", _UISubjectWages);
    cmd.Parameters.AddWithValue("?", _UIExcessWages);
    cmd.Parameters.AddWithValue("?", _UITaxRate);
    cmd.Parameters.AddWithValue("?", _UIPrepaid);
    cmd.Parameters.AddWithValue("?", _UIPenalty);
    cmd.Parameters.AddWithValue("?", _SWTSubjectWages);
    cmd.Parameters.AddWithValue("?", _SWTax);
    cmd.Parameters.AddWithValue("?", _SWTPrepaid);
    cmd.Parameters.AddWithValue("?", _SWTMonth1);
    cmd.Parameters.AddWithValue("?", _SWTMonth2);
    cmd.Parameters.AddWithValue("?", _SWTMonth3);
    cmd.Parameters.AddWithValue("?", _TriMetSubjectWages);
    cmd.Parameters.AddWithValue("?", _TriMetPrepaid);
    cmd.Parameters.AddWithValue("?", _LaneSubjectWages);
    cmd.Parameters.AddWithValue("?", _LanePrepaid);
    cmd.Parameters.AddWithValue("?", _WCHours);
    cmd.Parameters.AddWithValue("?", _WCPrepaid);
    cmd.Parameters.AddWithValue("?", _Businessid);
    cmd.Parameters.AddWithValue("?", _Year);
    cmd.Parameters.AddWithValue("?", _Quarter);
    cmd.ExecuteNonQuery();
}