كيفية استخدام واحد SqlTransaction متعددة SqlConnections في .الشبكة ؟

StackOverflow https://stackoverflow.com/questions/619857

سؤال

  1. لدي SQL Server 2000 ، أنه لا يدعم MultipleActiveResults.
  2. يجب أن لا تدرج متعددة, و يتم ذلك مع اتصال واحد في الإدراج.
  3. أريد أن أبدأ الصفقة قبل جميع الملاحق و الانتهاء منه بعد الإدراج.
  4. كيف أفعل ذلك ؟
هل كانت مفيدة؟

المحلول

ما هو السبب كنت لا تستخدم اتصال واحد و عدة أوامر (في الواقع أمر واحد صوغه في حلقة)?ربما هذا الحل سوف تعمل من أجلك:

   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

نصائح أخرى

أنت لم تحدد إذا كنت تستخدم .NET 2.0, لكن سأجعل هذا الافتراض.C# 3.0 التعليمات البرمجية المسرودة أدناه:

using (var tx = new TransactionScope()) {
    // Execute multiple DB statements inside here
    ts.Complete();
}

إذا كان أي من البيانات DB تفشل, ts.كاملة لن يتم التوصل إلى الصفقة سوف يتم التراجع تلقائيا في نهاية العبارة باستخدام.إلا أن أحد التحذير من أن هذا النهج هو أن عليك في نهاية المطاف الاستفادة DTC إذا كنت تستخدم وصلات متعددة ، مما يعني أداء أبطأ.

تحرير لتغيير SqlTransaction إلى TransactionScope

مثال على إجبار واحد اتصال SQL إلى تجنب استخدام DTC:

using (var tx = new TransactionScope())
using (var db = new SqlConnection(connString)) {
    // Command 1
    using (var cmd = db.CreateCommand()) {
        cmd.CommandText = "select...";
        using (var reader = cmd.ExecuteReader()) {
           // Process results or store them somewhere for later
        }
    }

    // Command 2
    using (var cmd = db.CreateCommand()) {
        cmd.CommandText = "select...";
        using (var reader = cmd.ExecuteReader()) {
           // Process results or store them somewhere for later
        }
    }

    // Command 3
    using (var cmd = db.CreateCommand()) {
        cmd.CommandText = "select...";
        using (var reader = cmd.ExecuteReader()) {
           // Process results or store them somewhere for later
        }
    }
    tx.Complete();
}

المعاملات التي تم إنشاؤها على اتصال و لا خارج نطاق الاتصال يتم إنشاؤها على ذلك لا يمكنك أن تفعل ما كنت طالبا.ريفاكتور بحيث يمكنك تنفيذ إدراج بالتتابع على اتصال وليس في وقت واحد أو تنفيذ آلية مختلفة لتحقيق الاستعادة (مثلا ، جدول إدخال المفاتيح التي يمكن استخدامها بوصفها ننظر إلى حذف إدخال السجلات وإذا تم مصادفة خطأ في وقت لاحق في هذه العملية)

لا أعتقد أن الصفقة يمكن أن تمتد عدة اتصالات.

ما هو المنطق من أجل القيام تدرج متعددة منفصلة في الاتصالات ؟ أعتقد أن كنت تريد لهم في اتصال واحد عادة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top