我想在按钮点击事件上执行查询。
但该查询是用另一个函数编写的。
这是我的代码,但它无效。我的问题是什么?
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 :(得分: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();
}