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

时间:2019-01-27 16:00:23

标签: c# sql sql-server

我正在填写注册表,我必须检查电子邮件是否有效并且已在我的数据库中使用。我想出了一种方法,但是我的代码有错误。如果显示“出了点问题”,并且在尝试使用新的电子邮件地址后,我在DataReader处出错,并且如果我直接使用新的电子邮件地址,则在ExecuteNonQuerry处显示了错误。有困难吗?我验证电子邮件地址的方法可以单独工作。谢谢。

        public bool IsValidEmail(string emailadress)
        {
            try
            {
                MailAddress m = new MailAddress(emailadress);
                return true;
            }
            catch
            {
                return false;
            }
        }
        public bool good(string emailadress)
        {
            SqlCommand cmd = new SqlCommand("SELECT Email FROM Clients", con);
            SqlDataReader dr = cmd.ExecuteReader();//error is here
            while (dr.Read())
            {
                if (dr[0].ToString() == textBox6.Text)
                {
                    return false;
                }
            }
            return true;
        }

private void button1_Click(object sender, EventArgs e) { if (IsValidEmail(textBox6.Text) && good(textBox6.Text)) { SqlCommand cmd1 = new SqlCommand("insert into Clienti(Name , Prename , Adress , Pass , Email ) values (@name , @prename ,@adress , @pass , @email)", con); cmd1.Parameters.AddWithValue("name", textBox1.Text); cmd1.Parameters.AddWithValue("prename", textBox2.Text); cmd1.Parameters.AddWithValue("adress", textBox3.Text); cmd1.Parameters.AddWithValue("pass", textBox4.Text); cmd1.Parameters.AddWithValue("email", textBox6.Text); cmd1.ExecuteNonQuery();//error is here cmd1.Dispose(); MessageBox.Show("success"); } else MessageBox.Show("something went wrong"); }

2 个答案:

答案 0 :(得分:0)

在从good函数返回值之前,请尝试关闭阅读器。如下所示:

        public bool good(string emailadress)
        {
            SqlCommand cmd = new SqlCommand("SELECT Email FROM Clients", con);
            SqlDataReader dr = cmd.ExecuteReader();//error is here
            while (dr.Read())
            {
                if (dr[0].ToString() == textBox6.Text)
                {
                    dr.Close();
                    return false;
                }
            }
            dr.Close();
            return true;
        }

答案 1 :(得分:0)

使用SqlDataReader后应将其关闭,否则它将保持连接锁定,并且只有在关闭连接后才能使用该连接。 但是,您不需要SqlDataReader即可发现您是否已经注册了电子邮件地址

curl -d ‘file=@myfile.txt’ -d localhost/submit.php

请记住,像SqlCommand,SqlDataReader这样的一次性对象非常重要,但应在需要它们时立即创建SqlConnection,并立即处置以释放宝贵的资源。
上面带有当场创建的连接的代码为:

public bool good(string emailadress)
{
    string query = @"IF EXISTS(SELECT 1 FROM Clients WHERE Email = @email) 
                     SELECT 1 ELSE SELECT 0";
    SqlCommand cmd = new SqlCommand(query, con);
    cmd.Parameters.Add("@email", SqlDbType.NVarChar).Value = emailadress;
    int result = (int)cmd.ExecuteScalar();
    return (result == 1);
}