2010-10-25 24 views
7

Acaba, bu SqlCommand kurucu aşırı yüküne sahip olmanın nedeni nedir:SqlConnection ve SqlTransaction neden SqlCommand kurucusunda var?

public SqlCommand(
    string cmdText, 
    SqlConnection connection, 
    SqlTransaction transaction 
) 

?

Bir argüman olarak verilen bir işlemi kullanarak kendi bit yapan bir iç yöntem oluşturmaya ihtiyaç duyduğumda, her zaman SqlTransaction'i yalnızca bu yönteme iletmek için yeterli buluyorum, çünkü, açıkça, bağlantı tran.Connection olacaktır.
Aynı şey bu aşırı yük için de geçerli değil mi? Sadece cmdText ve transaction iletmek yeterli olmaz mı?

farklıSqlConnection'e karşı açılan bir SqlTransaction sağlayan bir bağlantıya karşı bir SqlCommand yürütmek gerçekten mümkün mü? Bu sonuç ne olacak?

cevap

3

Bu, ilginç bir gözlemdir çünkü bir İşlemi farklı bir Bağlantıdan kullanamazsınız.

if ((this._transaction != null) && (this._activeConnection != this._transaction.Connection)) 
{ 
    throw ADP.TransactionConnectionMismatch(); 
} 

SqlCommand sınıfının genel tasarımı esnekliği için geçerli: System.Data.SqlClient.SqlCommand (4.0) bu da dahil birkaç doğrulama kontrolleri içerir ValidateCommand denilen özel üyesi vardır. CommandText, Connection ve Transaction özellikleri (üç ek kurucu aşırı yüklenmesinde de açığa çıkarılmıştır) okunur/yazılır. Bu, sınıfı esnek hale getirir, ancak yanlış kullanıma da eğilimlidir. Özellikler salt okunursa ve yapıcılar nesnelere veri aktarmanın birincil yolu olarak kullanılırsa, işler daha temiz olurdu. Bu durumda aşağıdaki yapıcı çok daha mantıklı olurdu: Ben bu özellikler varsayılan kurucuyu kullanarak nesne oluşturulur nerede sürükle-bırak tasarımcı desteğini etkinleştirmek için okuma/yazma olduğunu hayal ediyorum, ancak

public SqlCommand(string commandText, SqlTransaction transaction) 

ve özellikler InitializeComponent yönteminde ayarlanır.