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
更多关于HarmonyOS鸿蒙Next中如何判断db数据库事务批量执行sql语句是否执行成功的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,判断数据库事务批量执行SQL语句是否成功,可以通过以下步骤实现:
- 开启事务:使用
RdbStore
的beginTransaction()
方法开启事务。 - 执行SQL语句:在事务中执行批量SQL语句,使用
RdbStore
的executeSql()
方法。 - 提交事务:使用
RdbStore
的commit()
方法提交事务。如果所有SQL语句执行成功,事务提交成功。 - 捕获异常:如果在执行SQL语句过程中发生异常,使用
RdbStore
的rollback()
方法回滚事务。 - 判断结果:通过检查事务是否成功提交来判断批量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语句是否成功。