#c# #sql
#c# #sql
Вопрос:
Я пытаюсь вставить данные в таблицу внутри моей базы данных, но одно значение должно быть целым числом. Как это исправить? Пока что это мой код: у меня есть 3 текстовых поля, в которые можно вводить значения, и кнопка для их отправки.
private void button1_Click(object sender, EventArgs e)
{
//Maak inert query
string sqlIns = @"INSERT INTO Pizza (Soort, beschrijving, prijs)
VALUES ('" textBoxSoort.Text.Trim() "','" textBoxBescrhijving.Text.Trim() "', '" tetBoxPrijs "') ";
//Maak commando object
OleDbCommand command = new OleDbCommand(sqlIns, Connectie);
try
{
//Open de connectie
Connectie.Open();
//Voer commando uit
command.ExecuteReader();
Connectie.Close();
//Opnieuw vullen DatagridVieuw
vullendgv();
}
catch (OleDbException ex)
{
MessageBox.Show(ex.Message ex.StackTrace, "Exception details");
}
finally
{
//Sluiten van de connectie
Connectie.Close();
textBoxSoort.Clear();
textBoxBescrhijving.Clear();
tetBoxPrijs.Clear();
}
}
Комментарии:
1. Вы получаете какое-либо исключение или сообщение об ошибке? И вы всегда должны использовать параметризованные запросы . Такого рода конкатенации строк открыты для атак с использованием SQL-инъекций .
2. Вы действительно должны использовать параметры, или вы оставляете себя открытым для внедрения sql.
3. Какое из них является целым числом?
4. Вы должны использовать параметры, чтобы предотвратить внедрение sql.
5. @Alex Мои деньги на
tetBoxPrijs
![]()
Ответ №1:
У вас есть несколько проблем, связанных с вашим кодом:
- Используйте параметризованные запросы, чтобы предотвратить внедрение SQL. Встроенные запросы — это дьявол!
- Проверьте входные данные, прежде чем помещать их в запрос. Если значение текстового поля должно быть числовым, проверьте это или сделайте так, чтобы текстовое поле принимало только числовой ввод. Для достижения этой цели создайте метод, который проверяет, является ли ввод числовым (регулярное выражение или пользовательский код), и если вы хотите, чтобы TetxBox был только числовым, прочитайте эту статью .
Пример при использовании регулярного выражения для проверки, является ли введенное им числовое значение:
string numericPattern = "^[0-9] $"; string input = "1zd23"; bool result1 = Regex.IsMatch(value, numericPattern); //false string input = "456"; bool result2 = Regex.IsMatch(value, numericPattern); //true
И в методе:
public bool IsNumeric(string input) { return Regex.IsMatch(input, "^[0-9] $"); } //Usage: bool result = IsNumeric("qsd4156"); //false
- В вашем запросе вы добавляете объект TextBox
tetBoxPrijs
в запрос, а не его значение. Также не используйте одинарные кавычки, иначе это не будет рассматриваться как числовое значение в SQL. Вместо этого используйте этот кодtetBoxPrijs.Text
Но это должно быть числовым, так что на самом деле это должно быть:
Convert.ToInt32(tetBoxPrijs.Text)
Конечно, это происходит без проверки входных данных. Проверка может быть выполнена с помощью предоставленного метода с использованием регулярного выражения:
if(IsNumeric(tetBoxPrijs.Text)) { int prijs = Convert.ToInt32(tetBoxPrijs.Text); //use 'prijs' in query }
Обновить:
Еще проще использовать Int32 .Попробуйте метод разбора, как прокомментировал GarethD:
int numericValue;
if(Int32.TryParse(tetBoxPrijs.Text, out numericValue))
{
//valid, use in query
}
else
{
//not numeric, inform the user
}
Комментарии:
1. Приятно, что это помогает, да, я знаю, что он не защищен от SQL-инъекций, я узнаю, что в следующем году в школе это всего лишь тест.
2. Я обновил свой ответ дополнительным кодом и объяснением, чтобы помочь вам в дальнейшем!
![]()
3. Я бы лично просто использовал
int.TryParse()
для проверки. Не нужно изобретать велосипед.4. Вы правы, это не пришло мне в голову на момент написания. Я добавлю это, спасибо, что напомнили мне!
![]()