1

少し問題があります。このコードでは、常に catch{} セクションの発火があります。例外がスローされた場合でも。デバッガーでチェックインしたところ、例外はスローされていませんが、何らかの方法で catch{} からのコードが起動し、google.com に転送されます。catch{} のコードにコメントを付けると、Page は正常に動作します。誰かがそれがなぜなのか知っていますか?それは私を怒らせます。ありがとう

protected void Button5_Click(object sender, EventArgs e)
    {
        if (Page.IsValid == true)
        {
            try
            {
                conn = new MySqlConnection("Server=localhost;Port=3306;Database=ewidencja;Uid=webuser;Pwd=web1;");
                conn.Open();
                MySqlDataAdapter mda = new MySqlDataAdapter();
                mda.SelectCommand = new MySqlCommand("select id from pacjenci where pesel='" + Session["pesel"].ToString() + "';", conn);
                int id_pacjenta = (int)mda.SelectCommand.ExecuteScalar();
                int id_lekarza=Int32.Parse(DropDownList1.SelectedValue);
                mda.InsertCommand = new MySqlCommand("insert into planowane_wizyty (id_pacjenta, id_lekarza, data_wizyty) values(" + id_pacjenta + ", " + id_lekarza + ", '" + Calendar1.SelectedDate.ToString().Substring(0,10)+" "+ ListBox1.SelectedItem.Value + "');", conn);
                if (mda.InsertCommand.ExecuteNonQuery() == 1)
                    Response.Redirect("wizyty.aspx");
                else
                    Response.Redirect("info.aspx");
            }
            catch (Exception ex)
            {
                Response.Redirect("http://www.google.com");
            }
        }
    }
4

2 に答える 2

3

Response.Redirectを投げることができThreadAbortExceptionます。次に、これが外側の例外ハンドラにヒットし、2 番目のResponse.Redirect.

Response.Redirect が System.Threading.ThreadAbortException を引き起こす理由を参照してください。

さらに重要なことは、これが、データ アクセス コードを UI 動作と密接に混在させてはならない理由の 1 つです。このようなコードのデバッグは難しく、単体テストはほぼ不可能であり、再利用性は低くなります。

また、SQL インジェクションに対して脆弱な文字列連結を介してクエリが構築されているようです。代わりにクエリをパラメータ化してください。

于 2013-01-08T20:10:41.610 に答える
0

使用している Response.Redirect のオーバーロードは、常に現在のスレッドを停止しようとします。これにより、表示されている例外が発生します。System.Threading.ThreadAbortException

利用可能なオーバーロードがあります。これにより、パラメーターResponse.Redirect(string url, bool endResponse)を使用して現在のスレッドを終了するかどうかを制御できます。endResponse

そうは言っても、この特定のエラーをキャッチして無視することができます。以下の提案は、実装できるいくつかのソリューションの 1 つにすぎません。それはすべて、あなたが何をしようとしているのかにかかっています。

protected void Button5_Click(object sender, EventArgs e)
    {
        if (Page.IsValid == true)
        {
            try
            {
                conn = new MySqlConnection("Server=localhost;Port=3306;Database=ewidencja;Uid=webuser;Pwd=web1;");
                conn.Open();
                MySqlDataAdapter mda = new MySqlDataAdapter();
                mda.SelectCommand = new MySqlCommand("select id from pacjenci where pesel='" + Session["pesel"].ToString() + "';", conn);
                int id_pacjenta = (int)mda.SelectCommand.ExecuteScalar();
                int id_lekarza=Int32.Parse(DropDownList1.SelectedValue);
                mda.InsertCommand = new MySqlCommand("insert into planowane_wizyty (id_pacjenta, id_lekarza, data_wizyty) values(" + id_pacjenta + ", " + id_lekarza + ", '" + Calendar1.SelectedDate.ToString().Substring(0,10)+" "+ ListBox1.SelectedItem.Value + "');", conn);
                if (mda.InsertCommand.ExecuteNonQuery() == 1)
                    Response.Redirect("wizyty.aspx");
                else
                    Response.Redirect("info.aspx");
            }
            catch (System.Threading.ThreadAbortException)
            {
                //do nothing. This is an expected error stemming from Response.Redirect
            }
            catch (Exception ex)
            {
                Response.Redirect("http://www.google.com");
            }
        }
    }
于 2013-01-08T21:06:52.997 に答える