已经有与此命令关联的打开的DataReader,必须首先关闭

时间:2019-01-18 22:47:54

标签: c# sql-server

namespace ttt
{
    public partial class student : Form
    {
        SqlConnection conn = new SqlConnection(@"Data Source=DESKTOP-R0N4ID3;Initial Catalog=testOnedb;Integrated Security=True");

        SqlCommand com;
        SqlDataReader read;

        public student()
        {
            InitializeComponent();
            com = new SqlCommand("select * from testOnetable",conn);
            conn.Open();
            com.ExecuteReader();

            SqlDataReader read = com.ExecuteReader();

            while (read.Read())
            {
                listBox1.Items.Add("the username : " + read["username"].ToString() + "\n the passward : " + read["passward"].ToString() + "\n the email : " + read["email"].ToString());
            }

            read.Close();
            conn.Close();
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您需要将数据库交互元素(例如SqlConnectionSqlDataReader)的初始化包装在using块中,以便在您使用时调用Dispose方法与他们一起完成(或手动完成):

using (SqlCommand com = new SqlCommand("select * from testOnetable", conn))
using (SqlDataReader read = com.ExecuteReader()) {
    ....
}

关闭SqlDataReader不会失去对事物的控制权(我不确定具体的技术细节)。

此外,每次构建新的student实例时都打开一个新连接对数据库不利。您应该使用单例模式,并具有专用的数据访问对象类。

答案 1 :(得分:0)

您必须删除

> df[["partner"]] <- key[ match(df[['partner']], key[['name']] ) , 'id']
> df
  name heart_rate age partner
1   J9         78  35      M4
2   M4         82  23      J9
3   A3         67  43      T7
4   T7        105  52      A3
5   L4         85  33      K5
6   K5         94  45      L4

在您的代码中,该行没有用,因为您没有将引用分配给阅读器(在下一行中,您将获得引用,并在变量“阅读器”中正确分配了引用)

答案 2 :(得分:0)

可能不希望您第一次拨打ExecuteReader()

更改

...
conn.Open();
com.ExecuteReader();

SqlDataReader read = com.ExecuteReader();
...

收件人:

...
conn.Open();

如果您有意同时打开两个阅读器,请在连接字符串中设置MultipleActiveResultSets=True,如下所示:C# Using 2 sqldatareader at same time?

其他一些事情:您在这里处理SqlConnectionSqlCommandSqlDataReader的一次性用品。当不再需要它们时,应致电Dispose(),以更好地将using包裹在它们周围,以使它们自动处置。

将变量尽可能地保持本地化也是一个好主意。似乎连接不是命令或读者真正需要成为类的成员的原因,因为您仅在构造函数中使用它们。考虑将它们一起推入构造函数。这样,您也可以使用using来处理它们。否则,您必须在其中添加和销毁并销毁它们。

public partial class student : Form
{
    public student()
    {
        InitializeComponent();

        using (SqlConnection conn = new SqlConnection(@"Data Source=DESKTOP-R0N4ID3;Initial Catalog=testOnedb;Integrated Security=True"))
        {
            conn.Open();

            using (SqlCommand com = new SqlCommand("select * from testOnetable", conn))
            {
                using (SqlDataReader read = com.ExecuteReader())
                {
                    while (read.Read())
                    {
                        listBox1.Items.Add("the username : " + read["username"].ToString() + "\n the passward : " + read["passward"].ToString() + "\n the email : " + read["email"].ToString());
                    }

                    read.Close();
                }
            }

            conn.Close();
        }
    }

    private void student_Load(object sender, EventArgs e)
    {

    }
}