2009-03-22 17 views
33

Non sono sicuro che sia possibile o meno.Riutilizzare SqlCommand?

Attualmente sto lavorando a un progetto universitario e ho una funzione che utilizza stored procedure. Vorrei sapere se è possibile prendere la stessa istanza SqlCommand e applicare i parametri aggiornati per richiamare nuovamente la procedura memorizzata all'interno della stessa funzione.

Diciamo che ho qualcosa di simile nel mio codice:

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

E 'possibile aggiornare MyCommand 's parametri e chiamare di nuovo la stored procedure?

risposta

40

Sì. Dovrai assicurarti di chiamare myCommand.Parameters.Clear tra ogni chiamata per poter scaricare i parametri, ma non c'è nulla che ti impedisca di riutilizzare l'oggetto. (Non uso C# spesso, quindi potrebbe avere un errore o due nel testo)

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

Sì! Puoi sicuramente farlo. Puoi riutilizzare anche la stessa connessione.

Si potrebbe anche fare qualcosa di simile:

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

Questo è proprio come avvolgendo il collegamento in un try/catch per assicurarsi che sia chiusa.

+0

sfortunatamente Parameters.Add è ora obsoleto. Ma mi piace l'idea di usare – Dmitris

+10

@Dmitris, solo il sovraccarico Add (stringa, oggetto) è obsoleto. Tutti gli altri overload di Add vanno bene - vedi http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.add.aspx per maggiori informazioni. – LukeH