从C#代码

时间:2018-05-23 12:51:08

标签: c# ms-access

我想根据条件更新字段
如果年龄<25岁则等级= 10,否则等级= 20; 到目前为止,我已尝试过这些

 cmd = new OleDbCommand("update workClass Set Class = 10  when " + ds.Tables["no"].Rows[i][1] + " < 25   else Set Class =  20 ", con);
 cmd.ExecuteNonQuery();

第二

cmd = new OleDbCommand("update workClass Set Class = 10  where" + ds.Tables["no"].Rows[i][1] + " < 25   else Set Class =  20 ", con);
     cmd.ExecuteNonQuery();

我收到此错误消息
注意ds.tables在第一次迭代中返回33,以便该位正常工作

  

当33&lt;时,查询表达式'10中的语法错误(缺少运算符)。 25   else Class = 20'。

2 个答案:

答案 0 :(得分:1)

JET引擎中没有为Microsoft Access数据库提供支持的WHEN子句 你需要像这样使用IIF function

int[]

但是我建议你使用参数化查询来避免可能的解析错误和SQL注入

cmd = new OleDbCommand(@"update workClass Set Class = IIF(" + 
    ds.Tables["no"].Rows[i][1] + " < 25, 10, 20)", con);

答案 1 :(得分:1)

我有一种感觉,这就是你所追求的。

cmd = new OleDbCommand("UPDATE workClass SET [Class] = IIF([Age] < 25, 10, 20)", con);
cmd.ExecuteNonQuery();

但缺少的是描述符,因此您只能根据过滤器更新特定记录或记录集。编写您的查询时,每次执行时都会更新所有记录。要添加where子句,请确保使用参数添加过滤器,不要使用字符串连接。

示例:

cmd = new OleDbCommand("UPDATE workClass SET [Class] = IIF([Age] < 25, 10, 20) WHERE [someId] = ?", con);
cmd.Parameters.Add("@someId", OleDbType.Integer).Value = yourIdValue;
cmd.ExecuteNonQuery();

请务必注意,参数是在Ms Access中排序的,而不是命名的。查询中遇到的第一个参数必须与参数集合中的第一个参数相对应。