在 SQLite-WinRT 包装器中使用“更新”或“删除”查询获取受影响的行数
Posted
技术标签:
【中文标题】在 SQLite-WinRT 包装器中使用“更新”或“删除”查询获取受影响的行数【英文标题】:Get number of rows affected using 'Update' or 'Delete' query in SQLite-WinRT wrapper 【发布时间】:2016-06-05 12:59:43 【问题描述】:如何获取 SQLite-WinRT 包装器中影响删除或更新查询的行数?这是描述 Windows 运行时应用程序中 SQLite-WinRT 包装器的 CRUD 操作的blog。
一些代码sn-p是:
var dbFile = await StorageFile.GetFileFromPathAsync(dbPath);
db = new SQLiteWinRT.Database(dbFile);
await db.OpenAsync(SqliteOpenMode.OpenReadWrite);
await db.ExecuteStatementAsync("DELETE FROM Customer WHERE Name = 'abc'");
谢谢!
【问题讨论】:
【参考方案1】:SQLite-WinRT 代码库不使用sqlite3_changes()
或sqlite3_total_changes()
这两种SQLite 提供的函数来计算受影响的记录,因此似乎没有直接的API 来获取该数字。
但是 SQLite 具有 changes() 函数,因此您可以尝试在 DELETE
之后发出 SELECT CHANGES()
查询并读取返回值(使用 db.PrepareStatementAsync
、stmt.StepAsync
和 stmt.GetIntAt
)。
(目前无法测试这种方法)。
【讨论】:
啊,我明白了。谢谢。我会尝试这种方法并让你知道。一个问题:假设连续有 DELETE 和 UPDATE 查询并一一执行。SELECT CHANGES()
查询是否仅返回 UPDATE 查询产生的受影响行数?
返回最近完成的 INSERT、UPDATE 或 DELETE 语句修改、插入或删除的行数【参考方案2】:
您可以计算受 cmd.ExecuteNonQuery() 影响的行数,如下所示
int rowCount = Convert.ToInt32(cmd.ExecuteNonQuery());
行数将不包含因插入或更新而受影响的行数
【讨论】:
以上是关于在 SQLite-WinRT 包装器中使用“更新”或“删除”查询获取受影响的行数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 API 中隐藏迭代器以使用 std::map 包装器中的项目