Asp.net 已经有一个打开的DataReader与此命令关联,必须先关闭该命令

Asp.net 已经有一个打开的DataReader与此命令关联,必须先关闭该命令,asp.net,Asp.net,它一直给我 已存在与此命令关联的打开的DataReader,必须先关闭该命令 我的数据库代码到底出了什么问题,有人能帮我吗 protected void Button1_Click1(object sender, EventArgs e) { SqlConnection connect = new SqlConnection(ConfigurationManager.ConnectionStrings ["RegistrationConnectionString"].

它一直给我

已存在与此命令关联的打开的DataReader,必须先关闭该命令

我的数据库代码到底出了什么问题,有人能帮我吗

protected void Button1_Click1(object sender, EventArgs e)
{
    SqlConnection connect = new SqlConnection(ConfigurationManager.ConnectionStrings
          ["RegistrationConnectionString"].ConnectionString);
    connect.Open();     

    string insertQuery = @"IF NOT EXISTS(SELECT 1 FROM Registration where Username=@Uname) insert into Registration (Username,Password,Phone,Email,Country) values (@Uname ,@Password ,@Phone ,@Email ,@Country)";
    SqlCommand command = new SqlCommand(insertQuery, connect);
    command.Parameters.AddWithValue("@Uname", name.Text);
    command.Parameters.AddWithValue("@Phone", Phone.Text);
    command.Parameters.AddWithValue("@Email", Email.Text);
    command.Parameters.AddWithValue("@Password", Password.Text);
    command.Parameters.AddWithValue("@Country", Country.SelectedItem.ToString());
    SqlDataReader sdr = command.ExecuteReader();   

    if (sdr.HasRows) 
    {
    Response.Write("Username already exisited!");

}
else
{
    Response.Write("User name is available!");
}

command.ExecuteNonQuery();

connect.Close(); 
试试这个代码

using (SqlConnection connect = new SqlConnection(ConfigurationManager.ConnectionStrings
                    ["RegistrationConnectionString"].ConnectionString))
{
    connect.Open();
    string insertQuery = @"IF NOT EXISTS(SELECT 1 FROM Registration where Username=@Uname) insert into Registration (Username,Password,Phone,Email,Country) values (@Uname ,@Password ,@Phone ,@Email ,@Country)";
    using (SqlCommand command = new SqlCommand(insertQuery, connect))
    {
        command.Parameters.AddWithValue("@Uname", name.Text);
        command.Parameters.AddWithValue("@Phone", Phone.Text);
        command.Parameters.AddWithValue("@Email", Email.Text);
        command.Parameters.AddWithValue("@Password", Password.Text);
        command.Parameters.AddWithValue("@Country", Country.SelectedItem.ToString());
        if (command.ExecuteNonQuery() > 0)
        {
            Response.Write("User name is available!");                
        }
        else
        {
            Response.Write("Username already exisited!");
        }
    }
}

在调用ExecuteReader和调用ExecuteOnQuery时,分别调用了两次SqlCommand。由于您的语句从不将记录返回到客户端属性,因此HasRows将始终为false。最后,建议在实例化一次性对象时始终使用using语句。

如果您阅读错误消息,问题似乎很明显。命令上有一个打开的数据读取器,然后在命令上调用
ExecuteNonQuery
。这显然行不通。您只有一条语句,只需要执行一次。为什么不使用while(sdr.Read)?