使用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
相关产品推荐
相关产品推荐

