如何检测数据库stmt查询无匹配结果(stmt.numrows不支持)
检测SQLite查询无匹配记录的实现方案
你不需要依赖stmt.numrows属性判断结果是否为空,直接利用stmt.step()的返回值就能实现,这个方法在所有支持该API的SQLite JS驱动里都通用。
方法1:遍历过程中加标记位(最稳妥,不需要改动原有循环逻辑)
在循环外定义一个布尔标记,只要进入过循环就把标记设为true,循环结束后判断标记值即可:
stmt.bind({$ticket:"ABCD1245a"}); let foundRecord = false; while (stmt.step()) { foundRecord = true; console.log(stmt.get()); } if (!foundRecord) { // 这里写无匹配记录的处理逻辑 console.log("查询未命中任何记录"); }
这个方案完全兼容你原来的遍历写法,不需要调整现有取数逻辑,出错概率最低。
方法2:提前判断是否有结果(适合需要先做空判断再走后续逻辑的场景)
stmt.step()第一次调用就会返回是否存在第一行结果,如果返回false就直接代表结果集为空。注意如果第一次调用返回true,代表游标已经走到第一行,需要先取第一行数据再继续遍历剩下的内容,判断完如果不需要继续遍历要记得重置语句状态:
stmt.bind({$ticket:"ABCD1245a"}); const hasResult = stmt.step(); if (!hasResult) { console.log("无匹配记录"); stmt.reset(); // 重置语句游标,避免后续复用stmt时出现状态异常 } else { // 先取已经走到的第一行数据 console.log(stmt.get()); // 继续遍历剩余行 while (stmt.step()) { console.log(stmt.get()); } }
为什么stmt.numrows不好用
绝大多数SQLite的轻量JS绑定(包括浏览器端的sql.js、部分Node.js生态的SQLite驱动)不会在遍历结果前提前计算结果总行数,numrows属性通常只有在你遍历完所有结果之后才会返回正确数值,根本没法在遍历开始前用来判断空结果,用step()的返回值判断是兼容性最好的方案,没有环境依赖。
内容的提问来源于stack exchange,提问作者Grumpy
相关产品推荐
相关产品推荐

