1

ボタンクリックイベントでクエリを実行したい。

しかし、そのクエリは別の関数で記述されています。

ここに私のコードがありますが、機能していません。私の問題は何ですか?

namespace MCE_Member_Registration
{
    public partial class registration_form_view : System.Web.UI.Page
    {
        SqlConnection conn = new SqlConnection("ConnectionString");
        SqlCommand cmd;
        protected void Page_Load(object sender, EventArgs e)
        {
            createform();
        }

        protected void createform() {
            NameValueCollection nvc = Request.Form;
            surname.Text = nvc["txt_surname"];
            cmd.CommandText = "Insert into mce_applicants_information values(N'" + nvc["txt_surname"] + "')";
        }

        protected void confirm_Click(object sender, EventArgs e)
        {
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        }
    }
}
4

3 に答える 3

1

これで問題が解決するかどうかわかりません。ただし、コマンドを作成するために別のメソッドが本当に必要な場合は、それを返させてください。

protected SqlCommand  GetCommand() 
{
    SqlCommand cmd = new SqlCommand("Insert into blahblah values(blahblah)", connection);
    return cmd;
}

protected void Button1_Click() {
    connection.Open();
    GetCommand().ExecuteNonQuery();
    connection.Close();
}

いくつかの理由により、これはベスト プラクティスではないことに注意してください。例外が発生した場合でも接続を閉じる必要があるため、using代わりにステートメントを使用してください。しかし、接続はフィールドであるため、このアプローチではそれが問題になります。

したがって、パラメーターも使用してSQLインジェクション攻撃を防ぐオールインワンメソッドアプローチをお勧めします。

protected void Button1_Click() 
{
    ExecuteBlahBlahCommand("blahblah");
}

private void ExecuteBlahBlahCommand(string blaColumnVal)
{
    const string sql = "Insert into blahblah values(@blaColumn)";
    using (var con = new SqlConnection(connectionString))
    using (var cmd = new SqlCommand(sql, con))
    {
        cmd.Parameters.AddWithValue("@blaColumn", blaColumnVal);
        con.Open();
        cmd.ExecuteNonQuery();
    }
}
于 2013-03-14T09:38:10.577 に答える
0

質問自体への回答 - 関数内で宣言した変数は、その関数の外では見ることができません。SqlCommand正しいスコープで宣言する必要があります...

例えば:

SqlCommand cmd;
protected void CreateQuery() 
{
   cmd = new SqlCommand("Insert into blahblah values(blahblah),connection)";
}

protected void Button1_Click() 
{
  CreateQuery();
  connection.Open();
  cmd.ExecuteNonQuery();
  connection.Close();
}

これにより、クラス レベルで変数が宣言され、そのクラスの他のすべてのメソッドからアクセスできるようになります。

@Tim Schmelterの答えは、あなたのニーズにより適した優れたソリューションであることに言及します。

于 2013-03-14T09:38:27.470 に答える
0

このコードの前にcmdのインスタンスが作成されるため、コンストラクターではなく使用することをお勧めしますCommandText property。そのため、プロパティを調整します

protected void CreateQuery() {

    cmd.CommandText = "Insert into blahblah values(blahblah)";
}

protected void Button1_Click() {

    connection.Open();
    CreateQuery();

    cmd.ExecuteNonQuery();
    connection.Close();
}
于 2013-03-14T09:39:13.217 に答える