C# 重用SqlCommand?

C# 重用SqlCommand?,c#,.net,sql-server,C#,.net,Sql Server,我不确定这是否可能 我目前正在从事一个大学项目,我有一个使用存储过程的函数。我想知道是否可以使用相同的SqlCommand实例,并应用更新的参数在同一函数中再次调用存储过程 假设我的代码中有如下内容: myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; myConn = new SqlConnection(myConStr); myCommand = new System.Data

我不确定这是否可能

我目前正在从事一个大学项目,我有一个使用存储过程的函数。我想知道是否可以使用相同的
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的参数并再次调用存储过程

是的。您需要确保在每次调用之间调用myCommand.Parameters.Clear以转储参数,但没有任何东西阻止您重用该对象。(我不经常使用C#,因此文本中可能有一两处错误)


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

你也可以这样做:

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();
    }
}
myConStr=ConfigurationManager.ConnectionString[“myconString”]。ConnectionString;
使用(var cn=new-SqlConnection(myConStr))
使用(var cmd=new SqlCommand(“team5UserCurrentBooks3”,cn))
{
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(“@user\u id”,SqlDbType.Int).Value=userID;
cmd.Parameters.Add(“@book_id”,SqlDbType.Int);
cn.Open();

for(int i=0;iunfortionally Parameters.Add现在已经过时了。但是我喜欢你的想法using@Dmitris,仅添加(字符串、对象)重载已经过时。Add的所有其他重载都可以使用-有关详细信息,请参阅。与重用文本和参数保持不变的实例不同,在将其变为“新”命令之前,重用实例清除所有内容的实际应用性要小得多(与实际创建新命令相反)。这个答案值得一试,以证明您可以这样做,但除非分析器显示分配是一个热点,否则请不要在生产代码中这样做,因为它与声明一个名为
i
的泛型
int
并在需要整数时使用它一样有意义,不管它发生在我身上什么在任何给定的点上都有一个参数。@JeroenMostert如果要重复执行具有不同参数的存储过程,该怎么办?在每次迭代中清除参数是否明智?@TheIncorrigible1:否,因为如果您正在执行同一个存储过程,其参数列表将不会更改。在这种情况下,您可以重用该命令,但不应该清除参数——只需添加一次参数,并显式设置在每次迭代中更改的所有值即可。清除参数唯一有意义的情况是,有时您希望存储过程应用参数的默认值,而不知道该值是什么——这是可能的,但非常罕见.
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();
    }
}