【问题标题】:Reusing SqlCommand?重用 SqlCommand?
【发布时间】:2009-03-22 01:49:00
【问题描述】:

我不确定这是否可能。

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

【问题讨论】:

    标签: c# .net sql-server


    【解决方案1】:

    是的。您需要确保在每次调用之间调用 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();
    

    【讨论】:

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

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

    你也可以这样做:

    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_idusing 块就像将连接包装在 try/catch 中以确保它已关闭。

    【讨论】:

    • 不幸的是,Parameters.Add 现在已经过时了。但我喜欢你关于使用的想法
    • @Dmitris,只有 Add(string, object) 重载已过时。 Add 的所有其他重载都可以使用 - 请参阅 msdn.microsoft.com/en-us/library/… 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2011-01-06
    • 2012-06-29
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多