2009-03-22 17 views
33

Bunun mümkün olup olmadığından emin değilim.SqlCommand'ı Yeniden Kullanıyor musunuz?

Şu anda bir üniversite projesinde çalışıyorum ve saklı yordamları kullanan bir işlev var. Aynı SqlCommand örneğini alıp almadığınızı ve saklı yordamda aynı işlev içinde tekrar çağırmak için güncellenmiş parametreleri uygulayıp uygulamadığımı bilmek isterim.

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 
myConn = new SqlConnection(myConStr); 
myCommand = new System.Data.SqlClient.SqlCommand("team5UserCurrentBooks3", myConn); 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.Parameters.AddWithValue("@book_id", bookID); 
myCommand.Parameters.AddWithValue("@user_id", userID); 

try 
{ 
    myConn.Open(); 
    myCommand.ExecuteNonQuery(); 

mümkün mü MyCommand 'ın parametrelerini güncelleyip yeniden yordamını aramak için:

benim kodunda böyle bir şey var düşünelim?

cevap

40

Evet. Parametreleri dökmek için her bir çağrı arasında MyCommand.Parameters.Clear öğesini aradığınızdan emin olmak istersiniz, ancak nesneyi yeniden kullanmaktan vazgeçen hiçbir şey yoktur. (C# sık kullanmıyorum, bu nedenle bu bir hata ya da iki metin olabilir)

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 
myConn = new SqlConnection(myConStr); 
myConn.Open(); 

myCommand = new System.Data.SqlClient.SqlCommand("team5UserCurrentBooks3", myConn); 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.Parameters.AddWithValue("@book_id", bookID); 
myCommand.Parameters.AddWithValue("@user_id", userID); 
myCommand.ExecuteNonQuery(); 

myCommand.Parameters.Clear(); 
myCommand.CommandText= "NewStoredProcedureName"; 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.Parameters.AddWithValue("@foo_id", fooId); 
myCommand.Parameters.AddWithValue("@bar_id", barId); 
mycommand.ExecuteNonQuery(); 

myCommand.Parameters.Clear(); 
myCommand.CommandText = " SELECT * FROM table1 WHERE ID = @TID;" 
myCommand.CommandType = CommandType.Text; 
myCommand.Parameters.AddWithValue("@tid", tId); 
SqlReader rdr; 
rdr = myCommand.ExecuteReader(); 
9

Evet! Bunu kesinlikle yapabilirsin. Aynı bağlantıyı da tekrar kullanabilirsiniz.

Ayrıca böyle bir şey yapabileceğini:

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 
using (var cn = new SqlConnection(myConStr)) 
using (var cmd = new SqlCommand("team5UserCurrentBooks3", cn)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@book_id", SqlDbType.Int).Value = bookID; 
    cmd.Parameters.Add("@user_id", SqlDbType.Int).Value = userID; 

    cn.Open(); 
    cmd.ExecuteNonQuery(); 
} 

Bu sadece emin olmak için bir try/catch bağlantını sarma gibi Kapalı olduğunu edilir.

+0

Maalesef, Parameters.Add artık kullanılmamaktadır. Ancak, – Dmitris

+10

@ Dmitris'i kullanma hakkında bir fikriniz olsun, Sadece Add (string, object) aşırı yüklenmesi geçersizdir. Add'in diğer tüm aşırı yüklemeleri kullanışlıdır - daha fazla bilgi için bkz. Http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.add.aspx. – LukeH

İlgili konular