SQLiteCommand.Transaction是否必需?

时间:2014-12-17 19:34:17

标签: c# sqlite transactions system.data.sqlite

我使用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();
    }
}

1 个答案:

答案 0 :(得分:2)

不,您不需要手动设置Transaction属性。

交易开启时您对连接所做的一切都将与该交易挂钩。但是,这可能不适用于其他数据库引擎(虽然一般情况下我认为确实如此),因此如果您更改了数据库,请务必小心。

我发现ADO.NET接口没有任何理由令人费解;有很多冗余,提供商经常需要通过环节来获得界面某些部分的最佳性能(例如IDataParameter / IDataParameterCollection怪物。)