2013-03-14 114 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(); 
} 
相關問題