2015-09-25 3 views
1

Я искал How to check user id already exists, чтобы посмотреть, как это сделать.C# проверка если номер заказа уже существует

Я пытаюсь заставить это работать в моем коде, однако он не работает. Я не получаю ошибок или чего-то еще, но просто записываю данные в базу данных, даже если номер заказа уже существует.

Функция:

private void createorderButton_Click(object sender, EventArgs e) 
     { 
      SqlConnection myConnection = dbHelper.initiallizeDB(); 
      String query = "INSERT INTO testtabel (knaam, korder) VALUES ('" + knaamTextBox.Text + "','" + kordernrTextBox.Text + "')"; 
      SqlCommand sqlCommand = new SqlCommand(query, myConnection); 
      SqlCommand cmd = new SqlCommand("select * from testtabel where korder = @korder", myConnection); 
      SqlParameter param = new SqlParameter(); 
      param.ParameterName = "@korder"; 
      param.Value = kordernrTextBox.Text; 
      cmd.Parameters.Add(param); 

      //sqlCommand.Connection.Open(); 
      SqlDataReader reader = sqlCommand.ExecuteReader(); 

      if (reader.HasRows) 
      { 
       MessageBox.Show("Order already exist"); 

      } 
      else 
      { 
       reader.Close(); 
      } 

      // opens execute non query 
      int rows_inserted = sqlCommand.ExecuteNonQuery(); 

      if (rows_inserted > 0) 
      { 
       label2.Text = "Order has been created"; 
      } 

      else 
      { 
       Console.Write("Oops! Something wrong!"); 

      } 



     } 

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

+0

Вы подключаетесь к правильной базе данных? – User2012384

+0

Да :) Он тоже вставляет –

+3

Вы, похоже, не предъявляете свой SqlCommand SqlParameter? – JBond

ответ

2

Вы назвали неправильную команду, изменить

SqlDataReader reader = sqlCommand.ExecuteReader(); 

в

SqlDataReader reader = cmd.ExecuteReader(); 
1

Проблема здесь:

SqlDataReader reader = sqlCommand.ExecuteReader(); 

Вы должны выполнить другую команду первого

SqlCommand cmd = new SqlCommand("select * from testtabel where korder = @korder", myConnection); 

Последняя команда, когда будет выполняться покажет вам, если есть какая-либо запись в testtabel таблице , Если есть, то вы должны показать сообщение:

ордена уже существуют

В противном случае, вы будете выполнять свою первую команду, которая будет вставлять строки.

Кстати, попробуйте избежать конкатенации строк, когда вы пишете sql-запросы. Это одна из самых известных дыр в безопасности. Вы используете код для инъекций SQL. Вы можете использовать параметризованные запросы:

String query = "INSERT INTO testtabel (knaam, korder) VALUES (@knaam, @korder)"; 
SqlCommand sqlCommand = new SqlCommand(query, myConnection); 
sqlCommand.Parameters.Add(new SqlParamete("@knaam",knaamTextBox.Text)); 
sqlCommand.Parameters.Add(new SqlParamete("@korder",kordernrTextBox.Text)); 
0

Вы проверяете HasRows для INSERT INTO testtabel bla...bla..bla.. не `избирают * от testtabel где Кордер» Возможно, вы можете использовать это (оно исходит из моей головы и не скомпилировано, пожалуйста, отрегулируйте его в собственном случае)

private void createorderButton_Click(object sender, EventArgs e) 
     { 
      SqlConnection myConnection = dbHelper.initiallizeDB(); 
      String query = "INSERT INTO testtabel (knaam, korder) VALUES ('" + knaamTextBox.Text + "','" + kordernrTextBox.Text + "')"; 
      SqlCommand sqlCommand = new SqlCommand(query, myConnection); 
      SqlCommand cmd = new SqlCommand("select * from testtabel where korder = @korder", myConnection); 
      SqlParameter param = new SqlParameter(); 
      param.ParameterName = "@korder"; 
      param.Value = kordernrTextBox.Text; 
      //sqlCommand.Connection.Open(); 

      SqlDataReader cmdReader = sqlCommand.ExecuteReader(); 
      if (cmdReader.HasRows) 
      { 
       MessageBox.Show("Order already exist"); 

      } 
      else 
      { 
       cmdReader.Close(); 
      } 

      SqlDataReader reader = sqlCommand.ExecuteReader(); 
      // opens execute non query 
      int rows_inserted = sqlCommand.ExecuteNonQuery(); 

      if (rows_inserted > 0) 
      { 
       label2.Text = "Order has been created"; 
      } 

      else 
      { 
       Console.Write("Oops! Something wrong!"); 

      } 



     } 
1

Хотя ваш код полон проблем (магическая кнопка, инъекции SQL, отсутствие using s), есть основной. Подход, который вы хотите реализовать, терпит неудачу при одновременных вставках и не должен использоваться.

Представьте, что два пользователя запустить этот код с одной и той же базе данных, используя один и тот же korder значение:

  • 1st Выполняет SELECT - запись с заданным значением не существует;
  • 2-й исполняет SELECT - запись с заданным значением не существует;
  • 1-й исполняет INSERT - запись с заданным значением делает существует;
  • 2-й исполняет INSERT - ooops ...у нас есть дубликат;

Чтобы избежать дубликатов, вы должны использовать уникальные индексы в базе данных. Не полагайтесь на свой код.

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