2013-09-14 4 views
0

Может кто-нибудь, пожалуйста, скажите мне, почему я продолжаю получать «Недействительный ввод» в моем коде? Я проверил мою базу данных несколько раз, и я не могу найти проблему. Я использую нормализованную базу данных прямо сейчас.Недопустимый ввод в C#

Я просто заметил, что я вставил неправильный код

namespace MemorialSystem 
{ 
    public partial class Reservation : Form 
    { 
     SqlConnection con; 
     SqlCommand cmd; 
     SqlDataAdapter adapter; 
     SqlCommandBuilder cd; 
     DataSet ds; 

     public Reservation() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Form1 o = new Form1(); 
      o.Show(); 
      this.Hide(); 
     } 

     private void Reservation_Load(object sender, EventArgs e) 
     { 
      con = new SqlConnection("Data Source=(local);Initial Catalog=Memorial_park;Integrated Security=True"); 
      cmd = new SqlCommand("select * from Records", con); 
      adapter = new SqlDataAdapter(cmd); 
      cd = new SqlCommandBuilder(adapter); 
      ds = new DataSet(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      con.Open(); 
      try 
      { 

       if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == "" || comboBox1.Text == "" || textBox8.Text == "" || dateTimePicker1.Value.ToString("yyyyMMdd HH:mm:ss") == "" || dateTimePicker2.Value.ToString("yyyyMMdd HH:mm:ss") == "" || textBox7.Text == "" || textBox5.Text == "" || dateTimePicker3.Value.ToString("yyyyMMdd HH:mm:ss") == "") 
       { 
        MessageBox.Show("Please input a value!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
       } 
       else 
       { 
        if (MessageBox.Show("Are you sure you want to reserve this record?", "Reserve", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) 
        { 
         cmd = new SqlCommand("insert into Records(NameofLotOwner, HomeAddress, TelNo, RelationDeceased, NameOfDeceased, Address, DateofBirth, DateofDeath, PlaceofDeath, CausefDeath, DateofInterment) values('" + textBox1.Text + "', '" + textBox2.Text + "', '" + textBox3.Text + "', '" + comboBox1.SelectedItem + "', '" + textBox8.Text + "', '" + dateTimePicker1.Value.ToString("yyyyMMdd HH:mm:ss") + "', '" + dateTimePicker2.Value.ToString("yyyyMMdd HH:mm:ss") + "', '" + textBox7.Text + "', '" + textBox5.Text + "', '" + dateTimePicker3.Value.ToString("yyyyMMdd HH:mm:ss") + "')", con); 

         cmd.ExecuteNonQuery(); 

         MessageBox.Show("Your reservation has been made!", "Reserve", MessageBoxButtons.OK, MessageBoxIcon.Information); 
        } 
       } 
      } 

      catch (Exception x) 
      { 
       MessageBox.Show("Invalid Input"); 
      } 
      con.Close(); 
     } 

     private void label16_Click(object sender, EventArgs e) 
     { 

     } 
    } 
} 
+5

[Обязательный ...] (http://xkcd.com/327/) – dasblinkenlight

+1

, когда я вижу подобные запросы, я чувствую, что выбрасываю – meda

+5

Даже если вы обнаружите проблему, которую пытаетесь решить, не делайте того, что вы делаете: это неправильно на стольких уровнях! Начните с хранения паролей в текстовом виде: это просто неправильно. На данный момент ваш дизайн обречен без всякой надежды. Прочитайте [this] (http://stackoverflow.com/a/1054033/335858), прежде чем идти дальше с дизайном. – dasblinkenlight

ответ

4

Я предлагаю использовать параметризованный запрос, как этот

try 
    { 
     string cmdText = "select username, password from Login " + 
         "where [email protected] and [email protected]"; 
     using(SqlConnection con = new SqlConnection(.....)) 
     using(SqlCommand cmd = new SqlCommand(cmdText, con); 
     { 
      con.Open(); 
      cmd.Parameters.AddWithValue("@uname", textbox1.Text); 
      cmd.Parameters.AddWithValue("@pwd", textbox2.Text); 
      SqlDataReader reader = cmd.ExecuteReader(); 
      if (reader.Read()) 
      { 
       ...... 
      } 
     } 
    { 
    catch (Exception ex) 
    { 
     ..... 
    } 

В этом случае, если у вас есть апостроф в имени пользователя или пароля синтаксис, переданный базовому движку, будет правильно указан кодом рамки, и вы избежите Sql Injection (см. ссылку от dasblinkenlight в комментариях)

EDIT Теперь, когда вы обновили свой код, я думаю, что мое предложение более действенно, чем раньше.
Использование конкатенации строк для создания команды - очень плохая практика, так как вы можете видеть все, что требуется для выражения средней длины, такого как ваш.
Если вы используете коллекцию параметров SqlCommand, вы избежите всего этого беспорядка с указанием строк, десятичных знаков и значений даты и времени.

В качестве примечания стороны не следует открывать объект глобального соединения для срока службы вашей формы. Если вы забыли закрыть и утилизировать программу начнет просачиваться ресурсы и приложение становится неустойчивым (см using statement и Connection Pooling)

cmd = new SqlCommand("insert into Records(NameofLotOwner, HomeAddress, TelNo, " + 
         "RelationDeceased, NameOfDeceased, Address, DateofBirth, " + 
         "DateofDeath, PlaceofDeath, CausefDeath, DateofInterment) " + 
         "values(@p1, @p2, @p3,@p4, @p5 @p6, @p6, @p8, @p9,@p10, @p11)", con); 
cmd.Parameters.AddWithValue("@p1", textBox1.Text); 
..... 
cmd.Parameters.AddWithValue("@p6", dateTimePicker1.Value); 
..... 
+0

О, я только что заметил, что наклеил неправильный код. – Celine

+0

О, спасибо! Я попробую! :-) – Celine

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