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

我建议你使用CommandText property而不是构造函数,因为 cmd 的实例是在这段代码之前创建的,所以你调整你的属性

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 回答