HarmonyOS鸿蒙Next中如何判断db数据库事务批量执行sql语句是否执行成功

HarmonyOS鸿蒙Next中如何判断db数据库事务批量执行sql语句是否执行成功

4 回复

以下方案可以判断:

  • 方案一: 把IDE沙箱路径下的db文件copy出来,使用数据库工具执行打印的sql数据看是否可以执行成功,是否有数据存在;

  • 方案二: 使用下面的代码示例查看插入表中的数据是否存在:

querysql(){
    const STORE_CONFIG :relationalStore.StoreConfig = {
        name: 'database_name.db', // 数据库文件名
        securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别
        encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
        customDir: this._fileName + '/db', // 可选参数,数据库自定义路径。数据库将在如下的目录结构中被创建:context.databaseDir + '/rdb/' + customDir,其中context.databaseDir是应用沙箱对应的路径,'/rdb/'表示创建的是关系型数据库,customDir表示自定义的路径。当此参数不填时,默认在本应用沙箱目录下创建RdbStore实例。
        isReadOnly: false // 可选参数,指定数据库是否以只读方式打开。该参数默认为false,表示数据库可读可写。该参数为true时,只允许从数据库读取数据,不允许对数据库进行写操作,否则会返回错误码801。
    };
    relationalStore.getRdbStore(getContext(), STORE_CONFIG).then(async (rdbStore: relationalStore.RdbStore) => {
        console.info('Get RdbStore successfully.')
        rdbStore.beginTransaction();
        let sqlStr = 'SELECT * FROM `database_name`'
        let resultSet = rdbStore.querySqlSync(sqlStr)
        while (resultSet.goToNextRow()) {
            const id = resultSet.getLong(resultSet.getColumnIndex("query_id"));
            const name = resultSet.getString(resultSet.getColumnIndex("result"));
            console.info(`id=${id}, name=${name}`);
        }
        // 释放数据集的内存,若不释放可能会引起fd泄露与内存泄露
        resultSet.close();

        rdbStore.commit()
        console.log('成功')
        }
    )
}
  • 方案三: 使用hdc命令导出数据库,然后通过sqliteStudio或者其他工具打开db文件,查看数据是否存在。

    hdc命令:

hdc shell // 进入设备
find /data -name 数据库名字 // 查找数据库实际路径
exit // 退出
hdc file recv 数据库所在目录 导出的目的路径 // 导出数据库文件

更多关于HarmonyOS鸿蒙Next中如何判断db数据库事务批量执行sql语句是否执行成功的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


看返回提示

HarmonyOS Next中执行应用时,系统会启动ArkTS/ArkUI引擎,通过方舟编译器将应用代码转换为机器码,直接运行在鸿蒙微内核上。应用通过Stage模型管理生命周期,使用Ability框架实现功能模块,并调用分布式软总线实现跨设备协同。系统资源调度由统一的资源管理框架处理,确保高性能与低功耗。

在HarmonyOS Next中,使用关系型数据库(RDB)执行批量SQL语句时,可以通过以下方式判断事务是否执行成功:

核心方法:使用 RdbStore.executeSqlBatch 方法

该方法专门用于在事务中执行批量SQL操作,并返回明确的结果。

关键步骤:

  1. 构建语句列表:将需要批量执行的SQL语句和参数放入 List<ValuesBucket>List<String> 中。
  2. 调用 executeSqlBatch:在事务中执行此方法。
  3. 检查返回值:该方法的返回值是一个 int[] 数组。数组中的每个元素对应一条SQL语句的执行结果
    • 如果结果值 大于等于 0,表示该条SQL语句执行成功。对于INSERT操作,此值通常是新插入行的rowid;对于UPDATE或DELETE操作,此值是受影响的行数。
    • 如果结果值 等于 -1,表示该条SQL语句执行失败。
  4. 事务的原子性executeSqlBatch 本身是在一个事务中执行的。只要其中任意一条SQL语句失败(返回-1),整个事务将会自动回滚,所有更改都不会生效。方法会抛出 RdbException 异常。

示例代码逻辑:

import relationalStore from '@ohos.data.relationalStore';

// ... 获取 RdbStore 实例 (rdbStore) ...

let sqlBatch: relationalStore.ValuesBucket[] = [
  {
    sql: 'INSERT INTO user (name, age) VALUES (?, ?)',
    bindArgs: ['张三', 20]
  },
  {
    sql: 'UPDATE user SET age = ? WHERE name = ?',
    bindArgs: [21, '李四']
  }
];

try {
  let results: number[] = await rdbStore.executeSqlBatch(sqlBatch);
  
  // 判断批量执行是否完全成功
  let allSuccess: boolean = results.every((result) => result >= 0);
  
  if (allSuccess) {
    console.log('事务批量执行成功。');
    // 可以进一步检查results中每个具体值
    console.log(`插入操作结果: ${results[0]}, 更新操作影响行数: ${results[1]}`);
  } else {
    // 理论上,如果某条失败,事务已回滚并会进入catch块。
    // 此处的else分支用于处理结果检查逻辑。
    console.log('批量执行中存在失败语句。');
  }
} catch (err) {
  console.error(`事务批量执行失败,已回滚。错误信息: ${err.message}`);
}

判断总结:

  • 成功executeSqlBatch 方法未抛出异常,且返回的 int[] 中所有值均 >= 0。整个事务提交。
  • 失败executeSqlBatch 方法抛出 RdbException 异常。这意味着批量操作中至少有一条SQL执行出错,整个事务已自动回滚,数据库状态保持不变。你需要在 catch 块中进行错误处理。

因此,最直接可靠的判断方式是:只要 await rdbStore.executeSqlBatch(...) 未抛出异常,就代表整个批量事务已成功执行并提交。 随后你可以通过返回值数组分析每条语句的具体影响。

回到顶部