2013-03-14 126 views
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(); 
     } 
    } 
} 
+0

此查询执行空。我认为这是因为SqlCommand cmd的东西是在另一个功能... – user2163530 2013-03-14 09:37:53

+0

这是一个糟糕的设计,因为你正在设置一个对象在课堂上。 – 2013-03-14 09:38:17

回答

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

回答这个问题本身 - 你在函数内声明的任何变量不能被外面看到该功能。需要声明的正确scopeSqlCommand ...

例如:

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的答案是一个很好的解决方案,可以更好地满足您的需求。

+0

是的,我试过了,但仍然是空的查询执行。 – user2163530 2013-03-14 10:09:19

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(); 
} 
相关问题