5

私はC#(PHP、Python、およびJavascriptで作業した)が初めてで、多かれ少なかれ別のページの複製を作成し、いくつかを変更しようとしています-フォームとデータベースの送信を行います。

とにかく、ここにコードがあります:

public partial class commenter : System.Web.UI.Page
{

    string employee_reviewed;
    //public Commenter();
    public void SaveBtn_Click(object sender, EventArgs e)
    {
        if (CommentTB.Text == "Please enter a comment.")
        {
            String csname = "Email Error";
            Type cstype = this.GetType();
            ClientScriptManager cs = Page.ClientScript;
            if (!cs.IsStartupScriptRegistered(cstype, csname))
            {
                String cstext = "alert('Please submit at least one comment.');";
                cs.RegisterStartupScript(cstype, csname, cstext, true);
            }
            FormMessage.Text = "Please submit at least one comment.";
            return;
        }
        string comment = CommentTB.Text;
        comment = comment.Replace("'", "''");
        comment = comment.Replace("’", "''");
        comment = comment.Replace("`", "''");

        try
        {
            //myCommand.Connection.Open();
            //myCommand.ExecuteNonQuery();
            //myCommand.Connection.Close();

            MySqlCommand myCommand;
            MySqlConnection connection;
            string connStringName = "server=localhost;database=hourtracking;uid=username;password=password";
            connection = new MySqlConnection(connStringName);

            string sql_query;


            sql_query = "insert into peer_review_comment " + " (emp_id,  comment)" + " values(?employeeid, ?comment) ";

            //String csname = "Email Error";
            //Type cstype = this.GetType();
            //ClientScriptManager cs = Page.ClientScript;
            //cs.RegisterStartupScript(cstype, csname, sql_query, true);
            myCommand = new MySqlCommand(sql_query, connection);
            //FormMessage.Text = sql_query;
            //return;

            Trace.Write("comment = ", comment);
            myCommand.Parameters.Add(new MySqlParameter("?employeeid", ViewState["employeeid"].ToString()));
            myCommand.Parameters.Add(new MySqlParameter("?comment", comment));

            try
            {
                myCommand.Connection.Open();
                myCommand.ExecuteNonQuery();
                myCommand.Connection.Close();
            }
            catch (Exception ex)
            {
                FormMessage.Text = "Error:SaveBtn_Click - " + ex.Message;
            }
            //SendNotification(from, to, cc, subject, body, attach);
            FormMessage.Text = "\n Thank you for leaving anonymous feedback for " + employee_reviewed; ;
            ThankyouDiv.Visible = true;
            FormFieldDiv.Visible = false;
            reviewHeader.Visible = false;
        }
        catch (Exception ex)
        {
            FormMessage.Text = "Error:SaveBtn_Click - " + ex.Message;
        }
    }
}

私は自分が何をしているのかほとんどわかりません - チュートリアルを読んでいますが、C# は私が慣れ親しんでいる言語とは大きく異なります。

現在テキストを変更していないときに Javascript アラートが表示されますが、送信が機能していません。peer_review_commentデータベース テーブルに送信し、送信されたコメントと同様に従業員 ID を入力する必要があります。

私の理解がむらがある場合は申し訳ありませんが、私は完全なC#初心者です(現在http://www.csharp-station.com/Tutorial/CSharp/を読んでいます)

4

2 に答える 2

7

私の推測では、問題はここにあります:

try
{
    myCommand.Connection.Open();
    myCommand.ExecuteNonQuery();
    myCommand.Connection.Close();
}
catch (Exception ex)
{
    FormMessage.Text = "Error:SaveBtn_Click - " + ex.Message;
    // no "return;"  !!
}
//SendNotification(from, to, cc, subject, body, attach);
FormMessage.Text = "\n Thank you for leaving anonymous feedback for " + 
                        employee_reviewed; ;

あなたのcatchブロックはFormMessage.Textメソッドを終了しないボットの値を設定しているため、メソッドはcatchブロックが終了したところで実行を続け、Text値をリセットし、例外がスローされないように見えます。

return;例外メッセージを表示するには、catch ブロックの最後にa を追加します。

この種の問題をトラップしやすくするための一般的なガイドライン:

  • 1 つの方法で多くのことを実行しようとしないでください。メッセージを検証するメソッドを 1 つ (または を使用してクライアント側Validatorsで実行し、DB 呼び出しを実行する別のメソッドなどを用意します。
  • デバッガーの使い方を学びます。コードをステップ実行して、これらの種類のエラーの原因をよりよく理解することができます。
  • 例外について何かを行うことができない限り、例外をより高いレベルのイベント ハンドラー ( Elmahなど) にバブルアップさせても害はないため、ここでのように例外が誤って飲み込まれません。一般に、低レベルのメソッドで例外を再スローすることが望ましいです (おそらく、何らかのコンテキストまたはユーザーフレンドリーなメッセージを追加します)。これにより、高レベルの例外処理が何をすべきか (メッセージを表示する、ログを表示するなど) を決定できます。
于 2012-10-17T12:43:33.760 に答える
0

私はあなたのコードを自由にリファクタリングしました。これは、いくつかのより良いコード プラクティスを示していますが、問題も示している可能性があります。これらのコードの変更に加えて、D. Stanley の回答も読むことをお勧めします。そこにはいくつかの役立つヒントもあります。

if (CommentTB.Text == "Please enter a comment.") 
{ 
    String csname = "Email Error"; 
    Type cstype = this.GetType(); 
    ClientScriptManager cs = Page.ClientScript; 
    if (!cs.IsStartupScriptRegistered(cstype, csname)) 
    { 
        String cstext = "alert('Please submit at least one comment.');"; 
        cs.RegisterStartupScript(cstype, csname, cstext, true); 
    } 
    FormMessage.Text = "Please submit at least one comment."; 
    return; 
} 

// This helps some but very little, just wanted to show an alternative to writing three statements
string comment = CommentTB.Text.Replace("'", "''").Replace("’", "''").Replace("`", "''"); 
//string comment = CommentTB.Text; 
//comment = comment.Replace("'", "''"); 
//comment = comment.Replace("’", "''"); 
//comment = comment.Replace("`", "''"); 


try 
{ 
    // No need to do string concatenation...just make it one string.
    // sql_query = "insert into peer_review_comment " + " (emp_id,  comment)" + " values(?employeeid, ?comment) "; 
    string sql_query = "insert into peer_review_comment (emp_id,  comment) values (?employeeid, ?comment) "; 

    string connStringName = "server=localhost;database=hourtracking;uid=username;password=password"; 

    // Use a "using" clause because it guarantees the connection is closed even when an exception occurs.
    using (MySqlConnection connection = new MySqlConnection(connStringName)) 
    {
        connection.Open(); 

        // Again, use a "using" clause
        using (MySqlCommand myCommand = new MySqlCommand(sql_query, connection)) 
        {
            Trace.Write("comment = ", comment); 
            myCommand.Parameters.Add(new MySqlParameter("?employeeid", ViewState["employeeid"].ToString())); 
            myCommand.Parameters.Add(new MySqlParameter("?comment", comment)); 
            myCommand.ExecuteNonQuery(); 

            // No need for a Close statement with "using" clause.
            //myCommand.Connection.Close(); 
        }
    } 

    FormMessage.Text = "\n Thank you for leaving anonymous feedback for " + employee_reviewed;
    ThankyouDiv.Visible = true; 
    FormFieldDiv.Visible = false; 
    reviewHeader.Visible = false; 
}
catch (Exception ex) 
{ 
    FormMessage.Text = "Error:SaveBtn_Click - " + ex.Message; 
} 
于 2012-10-17T13:15:52.817 に答える