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

为什么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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:27:01