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");
    }

解決策:上記の2つの対応する行を次のように置き換えます。

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

解決策:上記の2つの対応する行を次のように置き換えます。

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

それはうまくいった。

于 2011-11-18T15:18:31.070 に答える