我使用System.Data.SQLite,我有一些代码,我在SQLite事务中包装了一系列命令。
是否需要将Transaction
属性设置为事务实例?似乎命令会自动从连接中获取它。
这对我来说很重要的原因是确定我必须传递给帮助函数 - 即。只是对连接或事务的引用。
修改
这是一个简化的例子。
private void ExecuteSql(SQLiteConnection conn, IEnumerable<string> sqlStatements)
{
using (var trans = conn.BeginTransaction())
{
try
{
foreach (var sql in sqlStatements) ExecuteSql(conn, sql);
}
catch
{
trans.Rollback();
throw; // pass up to higher level
}
trans.Commit();
}
}
private void ExecuteSql(SQLiteConnection conn, string sqlStatement)
{
using (var cmd = new SQLiteCommand(conn)
{
//Transaction = trans, -- necessary?
CommandText = sqlStatement,
})
{
cmd.ExecuteNonQuery();
}
}
答案 0 :(得分:2)
不,您不需要手动设置Transaction
属性。
交易开启时您对连接所做的一切都将与该交易挂钩。但是,这可能不适用于其他数据库引擎(虽然一般情况下我认为确实如此),因此如果您更改了数据库,请务必小心。
我发现ADO.NET接口没有任何理由令人费解;有很多冗余,提供商经常需要通过环节来获得界面某些部分的最佳性能(例如IDataParameter
/ IDataParameterCollection
怪物。)