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

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

【问题现象】

从网络下载一个sql文件,读取文件文本获取sql语句,通过事务执行sql语句进行建表和插入数据,使用RdbStore.executeSync执行sql语句,其中建表语句执行后返回null,插入语句执行后返回数字,执行select语句查看数据库语句执行后返回结果为空,查询结果如下:

点击放大

【背景知识】

关系型数据库是信息的集合,它以预定义的关系组织数据,数据存储在一个或多个由列和行构成的表(或称“关系”)中,用户可以轻松查看和理解不同数据结构之间的关系。 关系是不同表之间的逻辑连接,根据这些表之间的交互建立。

关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

图1 关系型数据库运作机制:

点击放大

事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。 事务就是一些SQL语句组(每条单独的SQL语句也算一个事务),其中事务中的SQL语句一个执行失败,其余全部回滚。

详情请参考:通过关系型数据库实现数据持久化

【定位思路】

建表语句正常返回的就是null,执行插入数据的sql语句返回数字就说明插入成功了,如果想要执行select查询是需要使用query或querySql方法,因此问题现象中使用RdbStore.executeSync执行select查询结果为空。

目前没有官方的数据库数据可视化查看工具,只支持导出查看,可用以下几个方案导出数据:

  • 思路一:
    把db文件copy出来,直接使用数据库可视化工具查看,是否有数据存在。

  • 思路二:
    使用querySqlSync方法获取数据库内容,遍历输出数据库每行数据,查看插入表中的数据是否存在。

  • 思路三:
    使用hdc脚本输出数据库,通过数据库可视化工具查看插入表中的数据是否存在。

【解决方案】

  • 方案一:
    把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

1 回复

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


在HarmonyOS鸿蒙Next中,判断数据库事务批量执行SQL语句是否成功,可以通过以下步骤实现:

  1. 开启事务:使用RdbStorebeginTransaction()方法开启事务。
  2. 执行SQL语句:在事务中执行批量SQL语句,使用RdbStoreexecuteSql()方法。
  3. 提交事务:使用RdbStorecommit()方法提交事务。如果所有SQL语句执行成功,事务提交成功。
  4. 捕获异常:如果在执行SQL语句过程中发生异常,使用RdbStorerollback()方法回滚事务。
  5. 判断结果:通过检查事务是否成功提交来判断批量SQL语句是否执行成功。如果事务提交成功,则批量SQL语句执行成功;如果事务回滚,则执行失败。

示例代码:

let rdbStore: RdbStore;
try {
    rdbStore.beginTransaction();
    // 执行批量SQL语句
    rdbStore.executeSql("INSERT INTO table1 VALUES (?, ?)", ["value1", "value2"]);
    rdbStore.executeSql("UPDATE table2 SET column1 = ? WHERE column2 = ?", ["newValue", "condition"]);
    rdbStore.commit();
    console.log("事务提交成功,批量SQL语句执行成功");
} catch (e) {
    rdbStore.rollback();
    console.log("事务回滚,批量SQL语句执行失败");
}

通过上述方法,可以判断数据库事务批量执行SQL语句是否成功。

回到顶部