C#操作MS Access 97数据库按id_car年月条件执行删除无响应问题
问题根因
BETWEEN运算符不支持通配符*,你在查询条件末尾拼接的*会被Access识别为普通字符参与匹配,而你的id_car字段值末尾不存在*,因此不会匹配到任何数据,自然没有删除动作。- 直接拼接SQL语句存在SQL注入风险,同时容易因为变量格式不符导致查询逻辑失效,建议使用参数化查询优化。
- 代码中声明的
OleDbDataAdapter对象没有被实际使用,属于冗余代码可以直接删除。
修正方案
你的id_car字段前6位为「2位月份+4位年份」,可以用Access内置的LEFT()函数截取前6位做范围匹配,修正后的代码如下:
string MesePartenza = Mese1; string MeseFinale = Mese2; // 补全月份前导0,保证前缀统一为6位:XX(月份)+ YYYY(年份) string startPrefix = MesePartenza.PadLeft(2, '0') + AnnoP.ToString(); string endPrefix = MeseFinale.PadLeft(2, '0') + AnnoF.ToString(); // 参数化SQL语句,OleDb参数按顺序匹配 OleDbCommand cmd = new OleDbCommand("DELETE FROM cartellini WHERE LEFT(id_car, 6) BETWEEN ? AND ?", connect); cmd.Parameters.AddWithValue("@start", startPrefix); cmd.Parameters.AddWithValue("@end", endPrefix); // 执行删除,返回受影响行数可用于验证删除结果 int deletedRows = cmd.ExecuteNonQuery();

额外注意事项
- 如果要做单前缀模糊匹配,需要用
LIKE运算符搭配通配符,例如匹配所有2023年1月的记录语法为WHERE id_car LIKE '012023*',不要将通配符和BETWEEN混用。 - 可以通过
deletedRows的值确认实际删除的行数,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Mrpit
相关产品推荐
相关产品推荐

