2013-03-14 3 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. Но это будет проблемой в этом подходе, поскольку соединение является полем.

Так я предпочел бы все-в-один метод подхода, который также использует параметры тро предотвратить 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

ответив сам вопрос - Любой переменной, Вы заявляете внутри функции не может быть видна снаружи эта функция. Вы должны объявить SqlCommand в правильном scope ...

Например:

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

Я предлагаю вам использовать CommandText property и не застройщик, так как экземпляр ЦМД создается до этого кода, так что вы настроить свойство

protected void CreateQuery() { 

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

protected void Button1_Click() { 

    connection.Open(); 
    CreateQuery(); 

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