资讯动态

仓颉标准库 database.sql 之 UpdateResult 接口详解:掌握 Insert/Update/Delete 执行结果处理

发布时间:2026/10/15 2:51:12 来源:尧图企业网站定制
人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载UpdateResult是仓颉标准库std.database.sql包中专门承载数据变更类 SQL 语句执行结果的接口它通过rowCount与lastInsertId两个属性让开发者能够准确获知每次INSERT、UPDATE、DELETE语句影响的行数以及自增主键等信息。阅读本文后你将掌握UpdateResult的接口定义、属性语义以及结合Statement.update()在实际增删改场景中的完整用法。接口定位数据变更语句的结果载体std.database.sql包为仓颉语言提供了访问数据库的通用接口配合数据库驱动Driver完成对数据库的各项操作。在该包中SQL 语句的执行结果被划分为两类接口QueryResult执行SELECT查询语句产生的结果接口用于遍历查询到的数据行UpdateResult执行INSERT、UPDATE、DELETE语句产生的结果接口用于反映数据变更的执行效果。二者的分工在包总览database_sql_package_overview.md与模块说明readme.md中均有明确记载UpdateResult归入SQL 语句执行分组紧邻Statement与QueryResult。也就是说凡是会修改数据库内容的语句其返回值类型基本都是UpdateResult。接口定义与成员属性在 API 参考文档 database_sql_package_interfaces.md 中UpdateResult的完整定义为public interface UpdateResult { prop lastInsertId: Int64 prop rowCount: Int64 }接口本身不继承任何父类型仅声明两个只读属性其语义如下表所示源自 UpdateResult_interface.md属性原型说明lastInsertIdprop lastInsertId: Int64执行INSERT语句自动生成的最后 row ID如果不支持则 row ID 为 0。rowCountprop rowCount: Int64执行INSERT、UPDATE、DELETE语句影响的行数。任何继承该接口的class、interface、struct都需要遵守上述属性的类型与语义约定。prop lastInsertId获取自动生成的主键 IDlastInsertId的类型为Int64对应核心库 Int64用于获取执行INSERT语句时数据库自动生成的最后一条 row ID。需要特别注意的边界行为当数据库驱动不支持该能力时返回值为0。因此在实际业务中lastInsertId的值并不总是可靠的自增主键是否支持取决于具体数据库驱动实现建议先验证驱动能力再做主键回填等业务逻辑。prop rowCount获取影响行数rowCount的类型同样为Int64表示INSERT、UPDATE、DELETE语句实际影响的数据行数。它是判断语句是否真正生效的通用手段执行UPDATE时若rowCount为0通常表示没有匹配到满足WHERE条件的记录执行DELETE时rowCount直接反映被删除的行数执行INSERT时单行插入的rowCount一般为1。实战从 Statement.update() 获取更新结果UpdateResult是Statement接口中update()方法的返回类型。在 API 文档 Statement_interface.md 中Statement预执行接口定义了如下两个更新入口名称原型说明update(): UpdateResult执行 sql 语句得到更新结果。update(deprecated)(params: ArraySqlDbType): UpdateResult执行 sql 语句得到更新结果。未来版本即将废弃不再使用可使用update()替代。典型的调用链是DriverManager.getDriver()获取驱动 →Driver.open()打开数据源 →Datasource.connect()获取连接 →Connection.prepareStatement(sql)预执行语句 →Statement.setT()绑定参数 →Statement.update()得到UpdateResult。下面结合仓库中的官方示例逐一演示。插入数据并读取结果以下代码来自示例文档 db_operations.md演示了连续执行两次插入并打印rowCount与lastInsertIdimport std.database.sql.* main() { // 获取数据库连接示例 let drv DriverManager.getDriver(opengauss) ?? return let ds drv.open(opengauss://testuser:testpwdlocalhost:5432/testdb, []) let conn ds.connect() // 插入数据 1 var stmt conn.prepareStatement(INSERT INTO test VALUES(?, ?)) stmt.setString(0, li lei) stmt.setInt32(1, 12) var ur stmt.update() println(Update Result: ${ur.rowCount} ${ur.lastInsertId}) // 插入数据 2 stmt.setString(0, han meimei) stmt.setInt32(1, 13) ur stmt.update() println(Update Result: ${ur.rowCount} ${ur.lastInsertId}) stmt.close() }其中setString(0, ...)、setInt32(1, ...)将仓颉原生类型绑定到 SQL 语句的?占位符调用update()后返回的ur.rowCount即本次插入影响的行数ur.lastInsertId为数据库自动生成的最后 row ID。更新与删除数据同一示例文档中的更新与删除操作同样借助UpdateResult反馈执行效果import std.database.sql.* main() { // 获取数据库连接示例 let drv DriverManager.getDriver(opengauss) ?? return let ds drv.open(opengauss://testuser:testpwdlocalhost:5432/testdb, []) let conn ds.connect() // 更新操作示例 var stmt conn.prepareStatement(update test set age ? where name ?) stmt.setInt32(0, 15) stmt.setString(1, li lei) var ur stmt.update() println(Update Result: ${ur.rowCount} ${ur.lastInsertId}) stmt.close() }import std.database.sql.* main() { // 获取数据库连接示例 let drv DriverManager.getDriver(opengauss) ?? return let ds drv.open(opengauss://testuser:testpwdlocalhost:5432/testdb, []) let conn ds.connect() // 删除操作示例 var stmt conn.prepareStatement(delete from test where name ?) stmt.setString(0, li lei) var ur stmt.update() println(Update Result: ${ur.rowCount} ${ur.lastInsertId}) stmt.close() }从示例可见无论是更新还是删除rowCount都是判断匹配行数的最直接依据。建表、删表等 DDL 场景update()同样可以执行不返回数据集的 DDL 语句返回的UpdateResult同样提供执行反馈。示例 db_modify_table.md 中演示了删表与建表import std.database.sql.* main() { // 获取数据库链接示例 let drv DriverManager.getDriver(opengauss) ?? return let opts [ (cachePrepStmts, true), (prepStmtCacheSize, 250), (prepStmtCacheSqlLimit, 2048) ] let ds drv.open(opengauss://testuser:testpwdlocalhost:5432/testdb, opts) let conn ds.connect() // 删除和创建表 var stmt conn.prepareStatement(DROP TABLE IF EXISTS test) var ur stmt.update() println(Update Result: ${ur.rowCount} ${ur.lastInsertId}) stmt.close() stmt conn.prepareStatement(CREATE TABLE test(id SERIAL PRIMARY KEY, name VARCHAR(20) NOT NULL, age INT)) ur stmt.update() println(Update Result: ${ur.rowCount} ${ur.lastInsertId}) stmt.close() }示例中的建表语句为id SERIAL PRIMARY KEY这正是lastInsertId得以生效的典型场景——SERIAL自增列由数据库自动生成主键值。深入如何可靠获取插入后的主键 IDlastInsertId依赖驱动支持若驱动不支持则固定返回0。如果需要稳妥地在插入后拿到主键仓库示例还提供了一种通用的替代方案在 SQL 语句中使用RETURNING子句再通过Statement.query()以QueryResult形式读取返回的主键列。见 db_operations.mdimport std.database.sql.* main() { // 获取数据库连接示例 let drv DriverManager.getDriver(opengauss) ?? return let ds drv.open(opengauss://testuser:testpwdlocalhost:5432/testdb, []) let conn ds.connect() // 如果需要在插入数据后返回插入的 id 值可以参考如下方式 let sql INSERT INTO test (name, age) VALUES (?,?) RETURNING id, name try (stmt conn.prepareStatement(sql)) { stmt.setString(0, li lei) stmt.setInt32(1, 12) let qr stmt.query() while (qr.next()) { println(id ${qr.getInt32(0)}, name${qr.getString(1)}) } } catch (e: Exception) { e.printStackTrace() } stmt.close() }因此在业务设计中可以按需选择仅需确认语句执行成功/影响行数使用update()rowCount需要拿到自动生成的主键优先使用RETURNINGquery()或在驱动支持的前提下使用lastInsertId注意不支持时为0的约定。与 QueryResult 的分工与注意事项UpdateResult与QueryResult分别面向数据变更与数据查询两类语句二者都是Statement接口的返回值类型。实践中需要注意以下几点类型对齐rowCount与lastInsertId均为Int64。在包总览 database_sql_package_overview.md 的 SQL 与仓颉类型对照表中BIGINT对应Int64、INTEGER对应Int32因此读取行数、ID 这类数值结果时按对应类型取值即可。lastInsertId的兼容性接口文档明确约定如果不支持则 row ID 为 0因此不能假设每次插入后该属性都有意义对不支持自增列或驱动不提供该能力的数据库应以0兜底处理。语句执行失败的处理Statement.update()在执行过程中发生异常如网络中断、服务器超时、参数个数不正确时会抛出 SqlException异常对象携带数据库供应商返回的errorCode与五字符sqlState可用于错误定位与排查。资源释放从示例中可以看到Statement在使用完毕后均调用stmt.close()释放资源在多语句、长连接场景下应养成良好的关闭习惯。小结UpdateResult是仓颉std.database.sql包中处理数据变更语句结果的核心接口rowCount提供通用的影响行数反馈lastInsertId提供驱动能力允许时的自增主键获取。结合Statement.update()与仓库中的官方示例即可在插入、更新、删除乃至建表、删表等各类语句执行后准确掌握数据库端的执行效果如需稳妥获取插入主键可进一步采用RETURNING子句配合QueryResult读取。相关完整 API 与示例可继续查阅接口完整定义database_sql_package_interfaces.md语句执行接口Statement_interface.md增删改实战示例db_operations.md建表删表示例db_modify_table.md赞分享人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载相关推荐仓颉标准库 database.sql 预执行接口 Statement 详解参数绑定、查询与更新的完整实践仓颉标准库 database.sql 预执行接口 Statement 详解参数绑定、查询与更新的完整实践 导读 std.database.sql 是仓颉标准库人工智能AI 技能文档开发工具仓颉 std.database.sql 实战Insert、Update、Delete 与 Select 数据库操作语句执行指南仓颉 std.database.sql 实战Insert、Update、Delete 与 Select 数据库操作语句执行指南 本篇基于仓颉标准库 std.d文档知识库教程OpenHarmony仓颉标准库 database.sql 异常处理指南SqlException 类全解析仓颉标准库 database.sql 异常处理指南SqlException 类全解析 本篇指南围绕仓颉标准库 std.database.sql 包中唯一的内置人工智能AI 技能文档开发工具上一篇让老 Mac 免费装上新系统OpenCore Legacy Patcher 完整上手教程下一篇TrollInstallerXiOS越狱安装神器终极方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑