小编典典

NET中如何对多个SqlConnection使用单个SqlTransaction?

sql

  1. 我有SQL Server 2000, 它不支持MultipleActiveResults
  2. 我必须进行多次插入,并且每次插入都要进行一次连接。
  3. 我想在所有插入之前开始一个事务,并在所有插入之后完成它。
  4. 我该怎么做?

阅读 181

收藏
2021-04-07

共1个答案

小编典典

您不使用一个连接和多个命令(实际上是在循环中重新创建一个命令)的原因是什么?也许此解决方案将为您工作:

   public static void CommandExecNonQuery(SqlCommand cmd, 
       string query, SqlParameter[] prms)
    {
        cmd.CommandText = query;
        cmd.Parameters.AddRange(prms);
        cmd.ExecuteNonQuery();
        cmd.Parameters.Clear();
    }

    static void Main(string[] args)
    {
        string insertQuery = 
           @"INSERT TESTTABLE (COLUMN1, COLUMN2) " + 
             "VALUES(@ParamCol1, @ParamCol2)";
        using (SqlConnection connection = 
          new SqlConnection(connectionString))
        {
            using (SqlCommand command = 
              connection.CreateCommand())
            {
                SqlTransaction transaction = null;
                try
                {
                    // BeginTransaction() Requires Open Connection
                    connection.Open();

                    transaction = connection.BeginTransaction();

                    // Assign Transaction to Command
                    command.Transaction = transaction;
                    for (int i = 0; i < 100; i++)
                        CommandExecNonQuery(command, insertQuery, 
                          new SqlParameter[] { 
                            new SqlParameter("@ParamCol1", i), 
                            new SqlParameter("@ParamCol2", i.ToString()) });
                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    connection.Close();
                }
            }
        }
    }

另请参见
Sql Server事务-ADO.NET 2.0-提交和回滚-使用语句-
IDisposable

2021-04-07