2009-03-06 28 views
2
  1. SQL Server 2000, var, bu, MultipleActiveResults'u desteklemiyor.
  2. Birden çok ek yapmam gerekiyor ve ekleme başına bir bağlantı ile tamamlandı.
  3. Tüm ekleme işlemlerinden önce bir işlem başlatmak ve tüm ekleme işlemlerinden sonra bitirmek istiyorum.
  4. Nasıl yaparım?
+2

bkz eşzamanlı gruplar için tek hususlar Bir bağlantı, belirli bir bağlantıda bir komut nesnesi ile kesinlikle birden çok yürütme olabilir. – cmsjr

+0

Jader, Cmsjr ile katılıyorum, SQL 8.00.194 ile test edilen sinple durum. Kodunuz belirli olabilir, ancak daha fazla bilgiye ihtiyacımız var. Sql Server 2000'de birden çok bağlantıya –

cevap

1

Tek bir bağlantı ve çoklu komut kullanmamanın nedeni nedir (aslında bir komut döngüde yeniden oluşturulmuş)? Belki bu çözüm sizin için çalışacaktır:

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

Ayrıca Kodunuzun bazı gönderebilir miyim, ben 2k MultipleActiveResults desteklemediğini olsun, ama
Sql Server Transactions - ADO.NET 2.0 - Commit and Rollback - Using Statement - IDisposable

+0

Sql Server 2000'de bunun mümkün olmadığını düşünüyorum. –

+0

SqlTransaction öğesini açık yakalama/sonek yerine bir kullanma deyimi ile atmak daha iyi olur. Bir işlemin atılması, işlenmemişse geri alır. – Joe

+0

Bu mümkün, Jader. SQL 8.00.194 –

4

.NET 2.0 kullanıp kullanmadığınızı belirtmediniz, ancak bu varsayımı yapacağım. başarısız DB ifadelerden herhangi, ts.complete ulaşılabilir asla ve işlem kullanılarak deyimi sonunda geri otomatik rulo edilecektir

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

: C# 3.0 örnek kodu aşağıda listelenmiştir. Bununla birlikte, bu yaklaşıma yönelik bir uyarı, birden fazla bağlantı kullanırsanız, daha düşük performans anlamına gelirse, DTC'den yararlanacağınızdır.

DTC kullanmaktan kaçınmak için tek bir SQL bağlantısı zorlama örneği TransactionScope için SQLTransaction değiştirmek Düzenlendi:

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(); 
} 
+0

alternatif? Sql Server 2005'in M.A.R.S'yi desteklediğini biliyorum, ancak 2000 bunu yapmıyor. –

+0

SqlTransaction için kamu kurucusu yok. Bir örnek oluşturmayı bildiğim tek yol, statik olmayan SqlConnection.BeginTransaction yöntemini kullanmaktır. –

+0

@Jader: Haklısın, TransactionScope'u kullanmak istemiştim. Yayın düzenlendi. – Chris

0

Bir işlemin birden çok bağlantı yayılan sanmıyorum.

Çoklu bağlantıların ayrı bağlantılarda yapılmasının nedeni nedir? Onların normalde tek bir bağlantıda olmasını isterdim.

+0

Sql Server 2000, MultipleActiveResultSets özelliğini desteklemiyor. Bu yüzden her bir ekleme için bir bağlantı oluşturmalıydım. –

+1

@JaderDias MARS, tek bir 'IDbConnection'ın çoklu' IDbCommand' ile yeniden kullanılması için gerekli değildir.Aslında, SqlClient kullanıyorsanız, ADO’nun bağlantı havuzu, kodunuz bağlantıyı kapatıp yeniden açıyor olsa bile, aynı bağlantıyı veritabanına yeniden kullanmanızı sağlayacaktır. – binki

1

İşlemler, bir bağlantı üzerinde oluşturulur ve oluşturuldukları bağlantıyı aşan bir kapsamı yoktur, böylece istediğiniz şeyi yapamazsınız. Refactor, böylece ekler aynı anda yerine yerine bir bağlantı üzerinde yürütmek veya geri alma elde etmek için farklı bir mekanizma uygulamak (örneğin, daha sonra bir hatayla karşılaşılırsa eklenen kayıtları silmek için bir arama olarak kullanılabilecek eklenmiş anahtarların bir tablo) süreç)

+0

OP'nin dileği mümkün değil. – Cheeso

İlgili konular