【问题标题】:Stored procedure in loop循环中的存储过程
【发布时间】:2013-03-04 09:14:57
【问题描述】:
for (int i = 0; i < purchaseListView.Items.Count; i++)
Connection con = new Connection();
                 SqlCommand cmd = new SqlCommand();
                 SqlCommand cmdFifo = new SqlCommand();
                 con.OpenConnection();
                 cmd.Connection = con.DataBaseConnection;
                 cmd.CommandType = CommandType.StoredProcedure;
                 cmd.CommandText = "insertDetail";
                 cmdFifo.Connection = con.DataBaseConnection;
                 cmdFifo.CommandType = CommandType.StoredProcedure;
                 cmdFifo.CommandText = "insertInToMain";

这是我的代码,我想知道循环是否会影响我的软件的性能,以及这是否是在循环中调用存储过程的正确方法。

我已将过程存储在一个类中,我想在单击保存按钮时从表单中调用它,并通过相同的存储过程在数据库中插入 10 个项目。

【问题讨论】:

    标签: sql-server-2005 stored-procedures


    【解决方案1】:

    好吧,你打开了 10 个连接,而且你似乎没有关闭它们,所以你可能会用完连接,但我猜这不是全部代码,你能发布整个 for 吗?

    【讨论】:

      【解决方案2】:

      我建议您创建一个表并通过迭代所有输入将整个数据插入其中,即尝试创建一个存储过程。 多次运行 for 循环效率低下,并且数据库会生成结果集的次数,这也会由于网络开销而影响您的性能。

      【讨论】:

        【解决方案3】:

        您正在为每个项目创建一个新的连接对象,这是非常低效的。

        创建一个连接对象并使用产品详细信息执行存储过程n 次。或者,创建一个存储过程来接受 10 个项目并在该级别插入数据。

        将此移到循环外(您可以在循环内访问concmd,而无需创建新实例:

          Connection con = new Connection();
          SqlCommand cmd = new SqlCommand();
          con.OpenConnection();
          cmd.Connection = con.DataBaseConnection;
          cmd.CommandType = CommandType.StoredProcedure;
          cmd.CommandText = "insertDetail";
        

        在循环中,您可以将所有参数添加到 cmd 对象。

         cmd.Parameters.Add("@Item", SqlDbType.Int);
         cmd.Parameters["@Item"].Value = purchaseListView.Items[i];
         cmd.ExecuteNonQuery();
        

        【讨论】:

        • 为 (int i = 0;i
        • @user2174542 - 不是真的。主要的低效率是您处于循环中并创建了许多冗余对象(即在循环内使用 new SQLCommand() )。您可以像我在回答中向您展示的那样重复使用对象。
        【解决方案4】:

        您应该在循环之前设置连接和存储过程,并且只更新命令参数值并在循环内执行。像这样:

        Connection con = new Connection();
        SqlCommand cmd = new SqlCommand();
        SqlCommand cmdFifo = new SqlCommand();
        con.OpenConnection();
        cmd.Connection = con.DataBaseConnection;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "insertDetail";
        cmd.Parameters.Add("@Item", SqlDbType.Int); 
        cmdFifo.Connection = con.DataBaseConnection;
        cmdFifo.CommandType = CommandType.StoredProcedure;
        cmdFifo.CommandText = "insertInToMain";
        //now that your connections & commands are set up, you can reuse them within the loop
        for (int i = 0; i < purchaseListView.Items.Count; i++)
        {
            //ToDo:assign any SP parameter values
            cmd.Parameters["@Item"].Value = purchaseListView.Items[i]; 
            // ...
        
            //then exec within the loop
            cmd.ExecuteNonQuery();
            cmdFifo.ExecuteNonQuery();
        }
        

        【讨论】:

        • 我想保留在类中传递参数的代码,并在单击保存按钮时调用存储过程。我只想打开一次连接并调用存储过程。请给我一个演示代码好吗!
        • 最好分配 SP 参数并在同一个类中运行 SP。它使 OO 设计更加原子化。正如@jcarlos 指出的那样,它还有助于避免连接泄漏。 (只要您在课堂上正确关闭和处置)。
        • 如果连接和 sqlcommand() a 和以下代码在类中的某个函数块中,我如何才能只调用 'cmd.Parameters.Add("@Item", SqlDbType.诠释); cmd.Parameters["@Item"].Value = purchaseListView.Items[i]; cmd.ExecuteNonQuery();'
        • 查看我的编辑。我在循环之前添加了参数。然后,在循环中,我分配它并执行。
        猜你喜欢
        • 2015-01-19
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多