繁体   English   中英

与C#中此命令错误关联的打开的数据读取器

[英]An open datareader associated with this command error in C#

我想构建一个简单的循环来检查来自SQL Server的传入数据,将其与文本字段进行比较,并在没有重复的情况下执行非查询。

我写了这段代码:

try
{
    bool exists = false;
    conn = new SqlConnection(DBConnectionString);

    SqlCommand check_user = new SqlCommand("SELECT usrEmail FROM tblUsers", conn);
    SqlCommand add_user = new SqlCommand("INSERT INTO tblUsers (usrEmail, usrPassword, usrRealname, usrIsowner) VALUES (@email, @pass, @name, @owner)", conn);
    // (I have removed all the paramaters from this code as they are working and irrelevant)
    conn.Open();

    SqlDataReader check = check_user.ExecuteReader();

    while (check.Read())
    {
        if (Convert.ToString(check[0]) == UserEmail.Text)
        {
            MessageBox.Show("The email you entered already exists in the system.");
            exists = true;
            break;
        }
    }

    if (exists == false)
    {
        add_user.ExecuteNonQuery();
    }
    else
    {
        return;
    }
}
catch (Exception ex)
{
    MessageBox.Show("There was a problem uploading data to the database. Please review the seller's details and try again. " + ex.Message);
    return;
}
finally
{
    conn.Close();
}

我使用断点,发现代码可以正常运行while循环,但是当它到达ExecuteNonQuery命令时,它返回一条错误消息:

已经有一个与此命令相关的打开的数据读取器,必须首先关闭

我试图使用check.Close(); 命令,但是当我这样做时,由于通过理解的原因,它突然卡在重复的电子邮件错误消息中。 另外,我尝试了一个修复程序,其中数据实际上已发送到数据库(我在SQL Server Management Studio中看到了),但是仍然给出了错误消息...甚至更奇怪,因为nonquery命令是LAST在此功能。 如果奏效了,为什么要去抓呢?

我已经在站点上搜索了答案,但是最常见的答案是MARS(我不知道那是什么)或数据集,在这种情况下,我不想使用它们。

这里有一个简单的解决方案吗? 我错过了代码中的某些内容吗?

简单的解决方法是:

using(SqlDataReader check = check_user.ExecuteReader())
{
    while (check.Read())
    {
        if (Convert.ToString(check[0]) == UserEmail.Text)
        {
            MessageBox.Show("The email you entered already exists in the system.");
            exists = true;
            break;
        }
    }
}

也就是说,此代码存在一些严重的问题。

首先,您并不是只想阅读所有用户以检查是否已使用电子邮件地址。 select count(*) from tblUsers where usrEmail = @email很好...

...或没有,因为有可能发生比赛。 您应该做的是在usrEmail列上添加唯一约束,然后insert into tblUsers ,以捕获违规情况。 或者,您可以根据需要使用merge

接下来,您真的不需要到处都有数据访问代码。 至少将其分解为单独的类/方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM