重用SqlCommand?

Dmi*_*ris 42 .net c# sql-server

我不确定这是否可行.

我目前正在开展一个大学项目,我有一个使用存储过程的函数.我想知道是否可以采用相同的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();
Run Code Online (Sandbox Code Playgroud)

是否可以更新MyCommand参数并再次调用存储过程?

Ste*_*ton 54

是.您需要确保在每次调用之间调用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();
Run Code Online (Sandbox Code Playgroud)

  • 与重用文本和参数保持不变的实例不同,重新使用实例在使其成为"新"命令之前清除所有内容的实际应用程序要少得多(与实际创建新命令相反).这个答案值得证明你可以做到,但请不要在生产代码中这样做,除非探查器显示分配是一个热点,因为它与声明一个通用的`int`有同样的意义.命名为"i"并在需要整数时使用它,无论它在任何给定点上的含义是什么. (3认同)
  • @TheIncorrigible1:不,因为如果您正在执行*相同的*存储过程,它的参数列表将不会改变。在这种情况下,您可以重用该命令,但不应清除参数 - 只需添加一次并显式设置每次迭代中更改的所有值即可。清除参数有意义的唯一情况是,因为您有时希望存储过程应用参数的默认值,而不知道该值是什么——有可能,但非常不寻常。 (2认同)

Joe*_*orn 13

是! 你绝对可以做到这一点.在一个函数中,您也可以重用相同的连接(我不建议为更大的范围重用连接对象,但这是可能的).

你也可以这样做:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将运行查询10次,并在user_id每次执行时使用相同,但更改book_id.该using块就像在try/catch中包装您的连接以确保它已关闭.

  • @Dmitris,只有Add(字符串,对象)重载已过时.Add的所有其他重载都可以使用 - 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.add.aspx. (11认同)