2013-03-14 5 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

+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 문을 대신 사용하십시오. 그러나 이것은 연결이 필드이기 때문에이 접근법에서 문제가 될 수 있습니다. 외부에서 볼 수없는 당신이 함수 내에서 선언 모든 변수 - 질문 자체를 응답

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

:

그래서 나는 또한 매개 변수 접근 금지는 SQL 주입 공격을 방지 사용하는 올인원 방식의 접근 방식을 선호 그 기능. 당신은 예를 들어 올바른 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의 대답은 사용자의 요구에 더 잘 부합 할 수있는 좋은 해결책이라는 것을 언급 할 것입니다.

+0

그래, 해봤지만 여전히 빈 쿼리가 실행됩니다. – user2163530

0

나는 cmd를의 인스턴스가이 코드 이전에 생성되기 때문에 당신이 CommandText property이 아닌 생성자를 사용하는 것이 좋습니다, 그래서 당신은 당신의 재산

protected void CreateQuery() { 

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

protected void Button1_Click() { 

    connection.Open(); 
    CreateQuery(); 

    cmd.ExecuteNonQuery(); 
    connection.Close(); 
} 
관련 문제