0

以下代码会产生错误。当我直接在服务器上调用 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;
4

3 回答 3

2

这似乎值得怀疑,

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

在while循环内!

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

于 2011-09-29T17:02:04.043 回答
1

Server.Transfer终止当前页面的执行并开始执行当前请求的新页面。此外, Transfer 调用End ,它在完成时引发ThreadAbortException异常。

我认为您正在尝试做的事情(并且我正在根据您正在尝试做的事情来回答 - 不一定是最佳实践)是验证用户是否已基于数据存储以某种方式获得授权/身份验证。你最好不要使用 ExecuteReader 。使用ExecuteScalar。如果 ExecuteScalar 的结果不为 null,则表示找到了用户。

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

else
{
   Server.Transfer("someErrorPage.aspx");
}
于 2011-09-29T17:18:43.607 回答
0

解决方案:将上面对应的两行替换为:

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

那行得通。

于 2011-11-18T15:18:31.070 回答