asp.net c#ExecuteReader()错误

时间:2011-09-29 16:56:40

标签: c# asp.net executereader

以下代码会产生错误。 当我直接在服务器上调用它时,dbo.getit工作正常。该错误发生在cmd.ExecuteReader()。我做错了什么?

    string user;
    string pw;
    SqlDataReader dr = null;
    SqlConnection conn = new SqlConnection("Data Source=xxx;Initial Catalog=myDB;    Integrated Security=True");

    user = Username.Text.Trim();
    pw = Password.Text.Trim();

    conn.Open();

   try {
        SqlCommand cmd = new SqlCommand("dbo.getit", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@param1", user);
        cmd.Parameters.AddWithValue("@param2", pw);

        dr = cmd.ExecuteReader();

        while ( dr.Read() )
        {
            Session["username"] = user;
            // Session["admin"] = 
            // Session["completed"] =
            Server.Transfer("all_is_well.aspx");

        }
        conn.Close();
        conn.Dispose();

    } catch (Exception ex) {
        if (dr != null)
        {
            dr.Close();
            conn.Close();
        }
        Server.Transfer("ERROR.aspx");
    }

解: 用以下代码替换上面两条相应的行:

SqlCommand cmd = new SqlCommand("select * from dbo.getit(@param1, @param2);", conn);
cmd.CommandType = CommandType.text;

3 个答案:

答案 0 :(得分:2)

这似乎有问题,

Session["username"] = user; 
Server.Transfer("all_is_well.aspx"); 

在while循环中!

您是否至少可以在阅读器上完成迭代,使用临时对象存储查询结果,然后初始化您的会话并执行Server.Transfer

答案 1 :(得分:1)

Server.Transfer 终止 执行当前页面并开始执行当前请求的新页面。此外,转移呼叫结束,完成后会抛出 ThreadAbortException 异常。

我认为你要做的事情(我根据你想要做的事情回答 - 不一定是最好的实践)来验证用户是否以某种方式获得授权/认证在数据存储上。你最好不要使用ExecuteReader。使用ExecuteScalar。如果ExecuteScalar的结果不为null,则找到该用户。

if (cmd.ExecuteScalar() != null)
{
   Server.Transfer("all_is_well.aspx");
}

else
{
   Server.Transfer("someErrorPage.aspx");
}

答案 2 :(得分:0)

解: 用以下代码替换上面两条相应的行:

SqlCommand cmd = new SqlCommand("select * from dbo.getit(@param1, @param2);", conn);
cmd.CommandType = CommandType.text;

那很有效。