我不确定这是否可行。
我目前正在开展大学项目,并且我有一个使用存储过程的函数。我想知道是否可以采用相同的SqlCommand
实例并应用更新的参数来在同一函数中再次调用存储过程。
让我说我的代码中有这样的东西:
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();
是否可以更新MyCommand
的参数并再次调用存储过程?
答案 0 :(得分:51)
是。您需要确保在每次调用之间调用myCommand.Parameters.Clear以转储参数,但没有什么可以阻止您重用该对象。 (我不经常使用C#,因此文本中可能有一两个错误)
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();
答案 1 :(得分:11)
是的!你绝对可以做到这一点。在一个函数中,您也可以重用相同的连接(我不建议为更大的范围重用连接对象,但这是可能的。)
您也可以这样做:
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("@user_id", SqlDbType.Int).Value = userID;
cmd.Parameters.Add("@book_id", SqlDbType.Int);
cn.Open();
for(int i = 0; i<10; i++)
{
cmd.Parameters["@book_id"].Value = i;
cmd.ExecuteNonQuery();
}
}
这将运行查询10次,并在每次执行时使用相同的user_id
,但更改book_id
。 using
块就像在try / catch中包装你的连接一样,以确保它已关闭。