为什么SQLiteConnection.Update(client)无法更新表条目,手写UPDATE也无效?
问题根因与解决说明
1 自定义UPDATE语句无生效无报错的原因
你调用的Db.Query<tclientes>()是查询专用方法,仅用于执行返回结果集的SELECT类语句,执行UPDATE、INSERT等DML写操作时,即使SQL合法执行,也不会反馈变更行数,也不会触发语法外的报错。除此之外你的SQL写法还存在两个高风险问题:
- 单批次执行多语句时,部分SQLite封装库会优先执行
PRAGMA encoding = "UTF-8"后直接截断后续语句,导致UPDATE逻辑根本没有执行 - 若你拼接SET子句时出现字段遗漏、值格式错误(比如字符串缺引号、日期格式不兼容),或是
cli_code传入值和表中存储值不匹配(比如存在首尾空格、大小写差异),UPDATE会匹配到0行,这种场景不属于SQL语法错误,不会触发异常,自然不会有数据变更
如果要执行自定义写操作,应该调用Db.Execute()方法而非Query方法。
2 Db.Update()触发无主键异常的原因
SQLite-net ORM的Update方法依赖模型类的特性标记识别主键,你仅在数据库表层面将cli_code设为主键是不够的,必须在tclientes模型类对应的cli_code属性上加上[PrimaryKey]特性,ORM才能识别主键用于构造WHERE匹配条件:
public class tclientes { [PrimaryKey] // 缺少该特性会导致Update方法找不到主键 public string cli_code { get; set; } // 其余属性定义 }
添加特性后即可正常调用Db.Update(cliente)方法。
3 InsertOrUpdate能正常执行的原因
InsertOrUpdate的执行逻辑不依赖模型类的主键特性标记:它会先尝试插入数据,若插入触发数据库表层面的主键冲突约束(即cli_code已存在),就自动转为更新对应行,所以你没给模型加主键特性也能正常运行。
补充建议
- 不要直接拼接SQL字符串,既容易引发SQL注入风险,也容易出现格式错误,优先使用参数化查询:
// 参数化更新示例 Db.Execute("UPDATE tclientes SET name = ?, phone = ? WHERE cli_code = ?", cliente.name, cliente.phone, cliente.cli_code);
- 若参数化执行后仍然无变更,可以把完整SQL打印出来,直接在SQLite客户端工具中执行验证,确认是否存在WHERE条件匹配不到行的问题。
内容的提问来源于stack exchange,提问作者Antonio P.
相关产品推荐
相关产品推荐

