You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Microsoft.Data.Sqlite.Core 9.0.2时事务与SqliteCommand问题咨询

问题解答

关于SqliteConnection无Transaction属性的问题

Microsoft.Data.Sqlite从设计之初就没有公开Transaction属性,你查阅的文档大概率是针对其他ADO.NET数据提供者(如System.Data.SqlClient)的。在Microsoft.Data.Sqlite中,事务管理依赖于SqliteConnection.BeginTransaction()方法返回的SqliteTransaction实例——你需要保留该实例,用于后续关联命令、提交或回滚操作。

关于SqliteCommand需手动设置Transaction的问题

正常情况下,连接开启事务后,后续创建的SqliteCommand会自动关联当前活跃事务。如果出现需要手动设置的情况,通常是以下场景导致:

  • 命令在事务开启之前就已创建:这种情况下,命令无法自动关联后续开启的事务,需手动将SqliteCommand.Transaction属性赋值为之前获取的SqliteTransaction实例。
  • 事务与命令分属不同线程:Microsoft.Data.Sqlite的连接和事务不支持跨线程操作,这种场景不仅会导致无法自动关联,本身也是不被推荐的用法。
  • 连接被关闭后重新打开:事务开启后若连接被关闭,事务会直接失效,重新打开连接后需要重新开启事务并关联命令。

另外,请确认SQLitePCLRaw.bundle_e_sqlcipher的版本与Microsoft.Data.Sqlite.Core 9.0.2兼容,版本不匹配可能引发异常行为,建议保持两者版本一致(均使用9.x系列)。

正确用法示例

using var connection = new SqliteConnection("Data Source=test.db;Password=yourpassword");
connection.Open();

// 开启事务并保留实例
using var transaction = connection.BeginTransaction();

// 事务开启后创建命令,自动关联事务
using var command = connection.CreateCommand();
command.CommandText = "INSERT INTO Users (Name) VALUES (@name)";
command.Parameters.AddWithValue("@name", "Alice");
command.ExecuteNonQuery();

// 若命令在事务开启前创建,需手动关联
// using var preTransactionCommand = connection.CreateCommand();
// preTransactionCommand.Transaction = transaction;
// preTransactionCommand.CommandText = "UPDATE Users SET Age = 30 WHERE Name = @name";
// preTransactionCommand.Parameters.AddWithValue("@name", "Alice");
// preTransactionCommand.ExecuteNonQuery();

transaction.Commit();

内容的提问来源于stack exchange,提问作者Michael T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:01:02