asp.net c#ExecuteReader()错误

asp.net c#ExecuteReader()错误,c#,asp.net,executereader,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");

下面的代码生成一个错误。 当我直接在服务器上调用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;
SqlCommand cmd = new SqlCommand("select * from dbo.getit(@param1, @param2);", conn);
cmd.CommandType = CommandType.text;

这似乎有点可疑

Session["username"] = user; 
Server.Transfer("all_is_well.aspx"); 
在while循环中


您能否至少在读卡器上完成迭代,使用临时对象存储查询结果,然后初始化会话并执行
服务器.Transfer

这似乎有点可疑

Session["username"] = user; 
Server.Transfer("all_is_well.aspx"); 
在while循环中

您能否至少在读卡器上完成迭代,使用临时对象存储查询结果,然后初始化会话并执行
服务器.Transfer

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

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

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

else
{
   Server.Transfer("someErrorPage.aspx");
}
Server.Transfer终止当前页面的执行,并开始执行当前请求的新页面。另外,传输调用End,它在完成时抛出ThreadAbortException异常

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

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

else
{
   Server.Transfer("someErrorPage.aspx");
}
解决方案: 将上面的两个对应行替换为:

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

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

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


成功了。

错误是由错误引起的。更具体地说明错误,我们就可以更好地更具体地说明错误。。。aka,请阅读并编辑您的问题。通常,异常ex有一条消息和堆栈跟踪。。请设置断点,阅读并发布这些信息,以便找到错误原因。我无法在我使用的环境中使用断点。我将尝试以某种方式将错误打印到网页上。在服务器之前。传输在会话中保存异常,然后在错误中保存。aspx读取会话并提示错误..啊哈,伊曼纽尔,德克萨斯州。一旦你告诉我,似乎很明显。我看到它找不到存储过程。这很奇怪,因为我在几周前编写的这个程序的VB版本中使用了相同的sql。tx,我想我可以从这里找到答案。错误是由错误引起的。更具体地说明错误,我们就可以更好地更具体地说明错误。。。aka,请阅读并编辑您的问题。通常,异常ex有一条消息和堆栈跟踪。。请设置断点,阅读并发布这些信息,以便找到错误原因。我无法在我使用的环境中使用断点。我将尝试以某种方式将错误打印到网页上。在服务器之前。传输在会话中保存异常,然后在错误中保存。aspx读取会话并提示错误..啊哈,伊曼纽尔,德克萨斯州。一旦你告诉我,似乎很明显。我看到它找不到存储过程。这很奇怪,因为我在几周前编写的这个程序的VB版本中使用了相同的sql。tx,我想我可以从这里找到答案。不是服务器。已知传输会在while循环中抛出
ThreadAbortException
Agree,更糟糕的情况是OP会设置一个bool,指示userFound=true。然后在读卡器完成后,如果(userfind)执行服务器传输,那么在循环中执行服务器传输是相当麻烦的。我不认为这是问题所在:读卡器被执行了,但是在那里编写的代码没有被执行。。这只是测试程序的无用示例代码。由于ThreadAbortException可能导致各种意外情况,请避免Server.Transfer。也不是服务器。已知传输会在while循环中抛出
ThreadAbortException
Agree,更糟的情况是OP可能会设置一个bool,指示userFound=true。然后在读卡器完成后,如果(userfind)执行服务器传输,那么在循环中执行服务器传输是相当麻烦的。我不认为这是问题所在:读卡器被执行了,但是在那里编写的代码没有被执行。。这只是测试程序的无用示例代码。由于ThreadAbortException可能导致各种意外情况,请避免Server.Transfer。考虑到我的出发点,我认为这是正确的方法;然而,这不是我的错误。由于某种原因,它给出了一个关于excecutescalar的错误。。。我现在正在试验不同的sql。问题的一部分是,我正在从使用工作完美的dataadapter(至少在vb中)切换到使用datareader。sql=“dbo.getit”;sql=“dbo.getit(@param1,@param2);”;sql=“select*from dbo.getit(@param1,@param2);”;等等。考虑到我的出发点,我认为这是正确的方法;然而,这不是我的错误。由于某种原因,它给出了一个关于excecutescalar的错误。。。我现在正在试验不同的sql。问题的一部分是,我正在从使用工作完美的dataadapter(至少在vb中)切换到使用datareader。sql=“dbo.getit”;sql=“dbo.getit(@param1,@param2);”;sql=“select*from dbo.getit(@param1,@param2);”;等