1

这段代码可靠吗?我尝试使用“使用”等。基本上是一种方法,可以作为 SQL 命令的序列列表传递,以针对 Sqlite 数据库运行。

我认为在 sqlite 默认情况下,在单个连接中运行的所有命令都是事务处理的,这是真的吗?这是真的?即我不应该(并且目前还没有进入代码)BeginTransaction 或 CommitTransaction。

它使用http://sqlite.phxsoftware.com/作为 sqlite ADO.net 数据库提供程序。

第一次尝试

private int ExecuteNonQueryTransactionally(List<string> sqlList)
{
    int totalRowsUpdated = 0;

    using (var conn = new SQLiteConnection(_connectionString))
    {
        // Open connection (one connection so should be transactional - confirm)
        conn.Open();

        // Apply each SQL statement passed in to sqlList
        foreach (string s in sqlList)
        {
            using (var cmd = new SQLiteCommand(conn))
            {
                cmd.CommandText = s;
                totalRowsUpdated = totalRowsUpdated + cmd.ExecuteNonQuery();
            }
        }
    }

    return totalRowsUpdated;
}

第三次尝试

这怎么样?

private int ExecuteNonQueryTransactionally(List<string> sqlList)
{
    int totalRowsUpdated = 0;

    using (var conn = new SQLiteConnection(_connectionString))
    {
        conn.Open();
        using (var trans = conn.BeginTransaction())
        {

            try
            {
                // Apply each SQL statement passed in to sqlList
                foreach (string s in sqlList)
                {
                    using (var cmd = new SQLiteCommand(conn))
                    {
                        cmd.CommandText = s;
                        totalRowsUpdated = totalRowsUpdated + cmd.ExecuteNonQuery();
                    }
                }

                trans.Commit();
            }
            catch (SQLiteException ex)
            {
                trans.Rollback();
                throw;
            }


        }
    }
    return totalRowsUpdated;
}

谢谢

4

1 回答 1

1

是的,这是真的,每个 SQLite 未嵌套的命令都嵌套在一个事务中。因此,如果您需要运行多个查询而不获取结果,那么显式启动事务、执行查询和提交会带来很多好处。

于 2010-03-18T02:57:06.993 回答