2015-06-14 3 views
1

Я экспериментирую с базами данных, и я нахожу различные методы оптимизации своих кодов. Здесь я использую другой класс, чтобы остановить повторную запись одних и тех же кодов, например, для добавления, удаления и обновления мы используем тот же метод ExecuteNonQuery(). До сих пор методы удаления обновлений работали хорошо, кроме Insert. Компилятор не дает никаких ошибок, но значения, взятые из текстовых полей, не идут на запрос строки переменной. Я новичок в кодировании C#. Может кто-нибудь мне помочь? или совет?Как вставить данные в базу данных? - Определенные пользователем классы

using DBconnectionExercise.DBConnection_Components; 
namespace DBconnectionExercise 
{ 
    public partial class Student_Form : Form 
    { 
     DBComps dc = new DBComps(); 

     //public string constring; 
     //public SqlConnection con = null; 
     //public SqlCommand com = null; 
     public String query; 

     public Student_Form() 
     { 
      InitializeComponent(); 

      //constring = "Data Source=ASHANE-PC\\ASHANESQL;Initial Catalog=SchoolDB;Integrated Security=True"; 
      //con = new SqlConnection(constring); 

      dc.ConnectDB(); 


     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

      loadGridData(); 

     } 
     private void dtp_dob_ValueChanged(object sender, EventArgs e) 
     { 
      DateTime Now = DateTime.Today; 
      DateTime Dob = dtp_dob.Value.Date; 
      int a = Now.Year - Dob.Year; 
      if (Now < Dob.AddYears(a)) a--; 
      tb_Age.Text = a.ToString(); 
     } 

     private void loadGridData() 
     { 
      try 
      { 
       query = "Select * from tb_Student"; 
       //dc.OpenCon(); 
       //SqlDataAdapter da = new SqlDataAdapter(query, con); 
       DataTable dt1 = new DataTable(); 
       dt1 = dc.Data_Table(query); 
       //da.Fill(dt); 
       Stu_DataGrid.DataSource = dt1; 
       //con.Close(); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     private void ClearData() 
     { 
      tb_Name.Clear(); 
      tb_Address.Clear(); 
      tb_Telno.Clear(); 
      tb_Search.Clear(); 
      tb_Age.Clear(); 
      dtp_dob.Value = DateTime.Today; 

     } 

     private void btn_Add_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       String name = tb_Name.Text; 
       DateTime dob = dtp_dob.Value.Date; 
       int age = Convert.ToInt32(tb_Age.Text); 
       String Address = tb_Address.Text; 
       int telno = Convert.ToInt32(tb_Telno.Text); 
       int line = 0; 


       //con.Open(); 
       query = "Insert into tb_Student values(@Stu_Name, @Stu_DOB, @Age, @Stu_Address, @Stu_Tel_no)"; 
       //query = "Insert into tb_Student (Stu_Name, Stu_DOB, Age, Stu_Address, Stu_Tel_no) Values('" + name + "','" + dob + "','" + age + "','" + Address + "','" + telno + "')"; 
       MessageBox.Show(query); 
       //com = new SqlCommand(query, con); 

       // This is the Insert/save code 

       DBComps.com.Parameters.AddWithValue("@Stu_Name", name); 
       DBComps.com.Parameters.AddWithValue("@Stu_DOB", dob); 
       DBComps.com.Parameters.AddWithValue("@Age", age); 
       DBComps.com.Parameters.AddWithValue("@Stu_Address", Address); 
       DBComps.com.Parameters.AddWithValue("@Stu_Tel_no", telno); 

       //line = com.ExecuteNonQuery(); 
       line = dc.ExeNonQuery(query); 
       //com.Dispose(); 
       //con.Close(); 

       if (line > 0) 
       { 
        loadGridData(); 
        ClearData(); 
        MessageBox.Show("Data saved sucessfully!", "Data Saved", MessageBoxButtons.OK, MessageBoxIcon.Information); 
       } 
       else 
        MessageBox.Show("Data not Saved", "Error Save", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

Это DBComps класс, который я использовал для записи Sql методы функции.

namespace DBconnectionExercise.DBConnection_Components 
    { 
     public class DBComps 
     { 
      public String conSring; 
      public SqlConnection con = null; 
      public static SqlCommand com = null; 

      public void ConnectDB() 
      { 
       conSring = "Data Source=ASHANE-PC\\ASHANESQL;Initial Catalog=SchoolDB;Integrated Security=True"; 
       con = new SqlConnection(conSring); 
      } 

      public void OpenCon() 
      { 
       con.Open(); 
      } 

      public void CloseCon() 
      { 
       con.Close(); 
      } 

      public int ExeNonQuery(String query) //the method for Insert, update and delete. 
      { 

       int line = 0; 
       OpenCon(); 
       com = new SqlCommand(query, con); 
       line = com.ExecuteNonQuery(); 
       com.Dispose(); 
       CloseCon(); 

       return line; 
      } 
    } 
} 
+0

Каждый раз, когда вы вызываете 'dc.ExeNonQuery', вы создаете новый экземпляр команды' com = new SqlCommand (query, con); ', тем самым теряя все параметры, добавленные ранее к предыдущему значению' com'. Самое простое решение - прекратить создание нового экземпляра команды каждый раз, заменив его, установив [свойство текста команды] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtext (v = vs.110) .aspx) существующей команды (!!! он может быть пустым в первый раз !!!). –

+0

P.S .: И это плохая идея смешать методы экземпляра и статические поля, когда это не требуется какой-либо реальной потребностью. Кроме того, может потребоваться [использование] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx) оператора. –

+0

@EugenePodskal Да, точно глупо меня. Я удалил их всех, и я наконец нашел ответ. Спасибо за помощь. –

ответ

1

ОК, наконец, я придумал ответ на свой вопрос, как и ожидал. Вот как это сделать;

private void btn_Add_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       String name = tb_Name.Text; 
       DateTime dob = dtp_dob.Value.Date; 
       int age = Convert.ToInt32(tb_Age.Text); 
       String Address = tb_Address.Text; 
       int telno = Convert.ToInt32(tb_Telno.Text); 
       int line = 0; 


       query = "Insert into tb_Student values('"+ name +"','"+ dob +"','"+ age +"','"+ Address +"','"+ telno +"')"; 

       MessageBox.Show(query); //To see it works! 

       line = dc.ExeNonQuery(query); 

       if (line > 0) 
       { 
        loadGridData(); 
        ClearData(); 
        MessageBox.Show("Data saved sucessfully!", "Data Saved", MessageBoxButtons.OK, MessageBoxIcon.Information); 
       } 
       else 
        MessageBox.Show("Data not Saved", "Error Save", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

Всегда помните, чтобы написать переменные/значения запроса, точно так же, как совпадать с заголовками таблицы. В противном случае он будет генерировать ошибки. Спасибо всем за помощь в этом вопросе! :-)

+0

ЛУЧШИЙ СПОСОБ ИСПОЛЬЗОВАНИЯ ИСПОЛЬЗОВАТЬ ПАРАМЕТРЫ! –

2

Это действительно очень плохой способ говорить с базой данных, ее взломать с помощью инъекции SQL и так как вы учитесь, его правильное время, чтобы указать на это:

query = "Insert into tb_Student values('"+ name +"','"+ dob +"','"+ age +"','"+ Address +"','"+ telno +"')"; 

читать на SQL инъекции как почему и как, и искать лучшие практики, чтобы найти лучшие способы.

+0

OK @mladen уже на нем. Благодарю. –

+0

Теперь я вижу, что я в большой опасности. Я должен использовать параметры для этой проблемы. Также исправлена ​​раздражающая ошибка в сборщике времени. Спасибо за то, что сообщили мне о SQL-инъекции. –

Смежные вопросы