从另一个函数执行查询

时间:2013-03-14 09:33:35

标签: asp.net sql function

我想在按钮点击事件上执行查询。

但该查询是用另一个函数编写的。

这是我的代码,但它无效。我的问题是什么?

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

3 个答案:

答案 0 :(得分: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语句。但这种方法存在问题,因为连接是一个字段。

所以我更喜欢一体化的方法,它也使用参数tro来防止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();
    }
}

答案 1 :(得分:0)

回答问题本身 - 在函数内部无法看到您在函数内声明的任何变量。您需要在正确的 scope 中声明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的答案是一个很好的解决方案,可能更适合您的需求。

答案 2 :(得分:0)

我建议您使用CommandText property而不是contructor,因为cmd的实例是在此代码之前创建的,因此您需要调整属性

protected void CreateQuery() {

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

protected void Button1_Click() {

    connection.Open();
    CreateQuery();

    cmd.ExecuteNonQuery();
    connection.Close();
}