读取器关闭时无效尝试调用MetaData

时间:2011-05-29 19:56:11

标签: asp.net sql-server

我想根据用户电子邮件是否存在于我的表中而在我的数据库中存储一些值。

这是代码:

SqlConnection con = new SqlConnection(@"Data Source=SAMA-PC\SQLEXPRESS;Initial Catalog=advCenter;Integrated Security=True");
        int str = 0;
        SqlCommand com2 = new SqlCommand("select [user_Account] from [User] where [user_Email]=@s", con);
        com2.Parameters.AddWithValue("@s", Convert.ToString(Session["mail"]));
        SqlDataReader rd;
        con.Open();
        rd = com2.ExecuteReader();
        if (rd.HasRows)
        {
                con.Close();
                con.Open();
                str = Convert.ToInt32(rd["user_Account"]);
                str = str + 30;
                SqlCommand co = new SqlCommand("update [User] set [user_Account]=@ua WHERE [user_Email]=@em", con);
                co.Parameters.AddWithValue("@ua", str);
                co.Parameters.AddWithValue("@em", Convert.ToString(Session["mail"]));
                co.ExecuteNonQuery();
                con.Close();
        }
        else
        {
            SqlCommand c = new SqlCommand("insert into [User] values(@e,@s,@a)", con);
            c.Parameters.AddWithValue("@e", Session["mail"].ToString());
            c.Parameters.AddWithValue("@s", "logged in");
            c.Parameters.AddWithValue("@a", "30");
            con.Open();
            c.ExecuteNonQuery();
            con.Close();
        }

但在运行代码时,我在此行收到错误Invalid attempt to call MetaData when reader is closed.

str = Convert.ToInt32(rd["user_Account"]);

我能做些什么来解决它?我在con.open()con.close()中尝试了越来越多,但每次我收到错误消息,表示reader已关闭或reader关联的whith行也已关闭。

3 个答案:

答案 0 :(得分:1)

在完成连接之前,不应关闭连接 。它应该保持打开状态,直到你完成它为止。

您还应该在此代码中只打开一次

您应该使用rd.Read()而不是HasRows。在此之前,读者不会被“填补”。

查看SqlDataReader文档中的示例,您的代码需要符合该调用序列。

答案 1 :(得分:1)

使用using语句。它将在闭合支撑处关闭你的连接。

using ( SqlConnection con = new SqlConnection(@"Data Source=SAMA-PC\SQLEXPRESS;Initial Catalog=advCenter;Integrated Security=True") )
{
    con.Open();

    // do work here...

    rd = com2.ExecuteReader();
    // use Read instead of HasRows. this will give false, if there is no data
    if (rd.Read())
    {
         //...
    }

}

答案 2 :(得分:0)

con.Close(); con.Open();不应该在那里。在if语句后删除这些。您正在关闭连接,然后重新打开它,导致所有数据丢失。

只需使用相同的连接,创建一个新的SQLCommand,然后在新的阅读器上运行它。这应该可以让你完成你想要做的事情。

干杯。