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个项目。
答案 0 :(得分:0)
您正在为每个项目创建一个非常低效的新连接对象。
创建一个连接对象,并使用产品详细信息执行存储过程n
次。或者,创建一个存储过程以接受10个项目并在该级别插入数据。
将其移到循环外部(您可以在循环内访问con
和cmd
而无需创建新实例:
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();
答案 1 :(得分:0)
好吧,你正在打开10个连接,似乎你没有关闭它们,所以你可能会用完连接,但我猜这不是整个代码,你可以发布整个吗? / p>
答案 2 :(得分:0)
您应该在循环之前设置连接和存储过程,并且只在循环内更新命令参数值和exec。像这样:
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();
}
答案 3 :(得分:0)
我建议你创建一个表,并通过遍历所有输入来插入整个数据,即尝试创建一个存储过程。 运行for循环多次填充时效率很低,并且数据库也会生成结果集次数,这会影响您的性能,因为网络开销也是如此。