[英]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.