gpt4 book ai didi

c# - 错误 : There is already an open DataReader associated with this Command which must be closed first

转载 作者:太空宇宙 更新时间:2023-11-03 14:45:33 27 4
gpt4 key购买 nike

我正在创建注册表单,我必须检查电子邮件是否有效以及是否已在我的数据库中使用。我想出了一种方法,但我的代码有错误。如果它显示“有问题”并且在我尝试使用新的电子邮件地址后,DataReader 出现错误,如果我直接使用新的电子邮件地址,它会在 ExecuteNonQuery 处显示错误。有什么想法吗?

我验证电子邮件地址的方法可以单独使用。谢谢。

    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 happens here

cmd1.Dispose();
MessageBox.Show("success");
}
else
MessageBox.Show("something went wrong");
}

最佳答案

SqlDataReader 在使用后应该关闭,否则它会保持连接锁定,并且在您关闭它之前您无法使用该连接。
但是,您不需要 SqlDataReader 来发现您是否已经注册了电子邮件地址

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);
}

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

public bool good(string emailadress)
{

string query = @"IF EXISTS(SELECT 1 FROM Clients WHERE Email = @email)
SELECT 1 ELSE SELECT 0";
using(SqlConnection con = new SqlConnection(....here put your connection string...))
using(SqlCommand cmd = new SqlCommand(query, con))
{
con.Open();
cmd.Parameters.Add("@email", SqlDbType.NVarChar).Value = emailadress;
int result = (int)cmd.ExecuteScalar();
return (result == 1);
}
}

关于c# - 错误 : There is already an open DataReader associated with this Command which must be closed first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54390056/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com