2009-03-22 27 views
33

Tôi không thực sự chắc chắn nếu điều này là có thể hay không.Sử dụng lại SqlCommand?

Tôi hiện đang làm việc trên một dự án đại học và tôi có một chức năng sử dụng thủ tục được lưu trữ. Tôi muốn biết nếu có thể thực hiện cùng một ví dụ SqlCommand và áp dụng các tham số cập nhật để gọi lại vào thủ tục được lưu trữ trong cùng một hàm.

phép nói rằng tôi có một cái gì đó như thế này trong mã của tôi:

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

Có thể cập nhật MyCommand 's các thông số và gọi thủ tục lưu trữ một lần nữa?

Trả lời

40

Có. Bạn sẽ muốn chắc chắn rằng bạn gọi myCommand.Parameters.Clear giữa mỗi cuộc gọi để kết xuất các tham số, nhưng không có gì ngăn cản bạn sử dụng lại đối tượng. (Tôi không sử dụng C# thường xuyên, do đó, điều này có thể có lỗi hoặc hai trong văn bản)

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

Có! Bạn chắc chắn có thể làm điều đó. Bạn cũng có thể sử dụng lại cùng một kết nối.

Bạn cũng có thể làm một cái gì đó như thế này:

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

này giống như gói kết nối của bạn trong một try/catch để chắc chắn rằng nó đóng cửa.

+0

không may Parameters.Add hiện đã lỗi thời. Nhưng tôi thích ý tưởng của bạn về việc sử dụng – Dmitris

+10

@ Dmitris, Chỉ quá tải (chuỗi, đối tượng) quá tải. Tất cả các tình trạng quá tải khác của Add đều tốt để sử dụng - xem http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.add.aspx để biết thêm thông tin. – LukeH

Các vấn đề liên quan