0

我所拥有的是ListView列表中每个项目的复选框。

单击按钮,我会像这样收集我的“已检查项目”;

ListView.CheckedListViewItemCollection checkedItems = emps.CheckedItems;

            List<string> attend = new List<string>();

            foreach (ListViewItem item in checkedItems)
            {
                attend.Add(item.Text);
            }

我知道这是有效的,因为我打印了这样的内容;

string s = String.Join(",", attend); MessageBox.Show(s);

但是,我想使用这些并为列表 ( )strings中的每个字符串运行 SQL 存储过程。attend

像这样;

SqlConnection con = new SqlConnection(conn);
            con.Open();
            SqlCommand cmd = new SqlCommand("my_SP", con);
            cmd.CommandType = CommandType.StoredProcedure;

            foreach (string item in attend)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.Add(new SqlParameter("@Name", item));
                cmd.Parameters.Add(new SqlParameter("@Course", attender.SelectedValue));
                cmd.ExecuteReader();
            }
            con.Close();

当我只检查列表中的一项时,这非常有效,当我检查多个项目时它会失败。

错误信息是;

There is already an open DataReader associated with this Command which must be closed first.

我已经尝试更改命令等的变量名称,但我没有看到 aDataReader打开的位置,我之前没有遇到过这个错误。

4

4 回答 4

1

打开连接时尝试以下方法

使用 (SqlConnection conn = new SqlConnection())
{
    conn.Open();
    Sqlmd.Connection = 连接;
    SqlDataAdapter da = new SqlDataAdapter(Sqlmd);
   //...ETC
}
于 2013-06-17T10:56:40.850 回答
1

因为在你使用的循环内

cmd.ExecuteReader();

这个,首先循环打开一个 SqlDataReader(它未分配但它仍然存在),然后,当您重新执行循环时,未使用的 SqlDataReader 仍然阻塞连接。

而是使用

cmd.ExecuteNonQuery();

确实应该在需要从数据库中读取数据的时候使用ExecuteReader,而不是需要做插入、更新、删除操作的时候,所以你的代码应该这样改

    using(SqlConnection con = new SqlConnection(conn))
    using(SqlCommand cmd = new SqlCommand("my_SP", con))
    {
        con.Open();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@Name", ""));
        cmd.Parameters.Add(new SqlParameter("@Course", ""));
        foreach (string item in attend)
        {
            cmd.Parameters["@Name"].Value = item;
            cmd.Parameters["@Course"].Value  = attender.SelectedValue);
            cmd.ExecuteNonQuery();
        }
     }

也可以在循环外声明和添加参数,仅更改循环内的值。这将提供更快的速度

于 2013-06-17T10:58:49.357 回答
0

尝试使用以下代码

SqlConnection con = new SqlConnection(conn);
            con.Open();


            foreach (string item in attend)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.Add(new SqlParameter("@Name", item));
                cmd.Parameters.Add(new SqlParameter("@Course", attender.SelectedValue));
               SqlDataReader dtr = cmd.ExecuteReader();
 dtr.close();
            }
            con.Close();
于 2013-06-17T11:04:05.753 回答
0

感谢您的帮助,这让我觉得打开/关闭我的连接有些问题。

我像这样绕过它;

foreach (string item in attend)
            {
                con.Open();
                cmd.Parameters.Clear();
                cmd.Parameters.Add(new SqlParameter("@Name", item));
                cmd.Parameters.Add(new SqlParameter("@Course", attender.SelectedValue));
                cmd.ExecuteReader();
                con.Close();
            }

尽管多次打开和关闭连接可能效率低下。

于 2013-06-17T11:04:12.780 回答