OriginalGriff
Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.
Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.
Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
Не имеет значения, используете ли вы DataReader или DataAdapter - SQL-инъекция начинается при объединении строк. Так что этот код представляет собой проблему:
string insert12 = "INSERT INTO thickness (GaugeMan,Dateandtime, CompondRubber,GSthickness,WSthicknes) VALUES ('" + comboBoxstaff.Text + "','" + label2.Text + "', '" + comboBoxcompondrubber.Text + "', '" + textBox2.Text + "', '" + textBox1.Text + "')"; //insert statment
SQLiteCommand ins1 = new SQLiteCommand(insert12, insertsess);
insertsess.Open();
ins1.ExecuteNonQuery();
Преобразуйте его (все остальное ваше приложение) в параметризованный запрос:
string insert12 = "INSERT INTO thickness (GaugeMan,Dateandtime, CompondRubber,GSthickness,WSthicknes) VALUES (@GM, @DT, @CR, @GST, @WST)"
SQLiteCommand ins1 = new SQLiteCommand(insert12, insertsess);
ins1.Parameters.AddWithValue("@GM", comboBoxstaff.Text);
ins1.Parameters.AddWithValue("@DT", label2.Text);
ins1.Parameters.AddWithValue("@CR", comboBoxcompondrubber.Text);
ins1.Parameters.AddWithValue("@GST", textBox2.Text);
ins1.Parameters.AddWithValue("@WST", textBox1.Text);
insertsess.Open();
ins1.ExecuteNonQuery();
Обратите внимание, что вы несете ответственность за закрытие и удаление всех объектов доступа к базе данных, поэтому также очень хорошо использовать
using
блок для соединения, команды и тому подобного.
Я бы тоже поставил эту связь.Открытый вызов близок к конструкции соединения, а не смешивается с кодом дальше вниз. Таким образом, меньше шансов вызвать проблемы при изменении или копировании кода.
Member 13809133
Вы имеете в виду вот так @originalGriff
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
если (comboBoxstaff.Текстовая строка.Пустой)
{
Ящик для сообщений.Показать("Пожалуйста, выберите gaugeman");
вернуть;
}
еще если (comboBoxcompondrubber.Текстовая строка.Пустой)
{
Ящик для сообщений.Показать("Пожалуйста, Выберите Compond Rubber");
вернуть;
}
остальное, если (элемент textbox1.Текст == строка.Пустой)
{
Ящик для сообщений.Показать("пожалуйста, введите толщину W. S");
вернуть;
}
остальное, если (поле textbox2.Текст == строка.Пустой)
{
Ящик для сообщений.Показать("пожалуйста, введите толщину G. S");
}
SQLiteConnection insertsess = new SQLiteConnection("источник данных=|DataDirectory|\\test1db");
строка insert12 = "вставить в толщину (GaugeMan,Dateandtime, CompondRubber,GSthickness,WSthicknes) значения (@GM, @DT, @CR, @GST, @WST)";
SQLiteCommand ins1 = новая команда SQLiteCommand(insert12, insertsess);
ins1.параметры.AddWithValue ("@GaugeMan", comboBoxstaff.Text);
ins1.параметры.AddWithValue("@Dateandtime", label2.Text);
ins1.параметры.AddWithValue("@CompondRubber", comboBoxcompondrubber.Text);
ins1.параметры.AddWithValue ("@GSthickness", textBox2.Text);
ins1.параметры.AddWithValue("@WSthicknes", textBox1.Text);
инсертесс.Открыть();
ins1.Метод executenonquery();
инсертесс.Закрывать();
Ящик для сообщений.Показать("данные были сохранены");
dataGridView1.Источник данных = значение null;
SQLiteConnection conn123 = new SQLiteConnection("источник данных=|DataDirectory|\\test1db");
conn123.Открыть();
sda = new SQLiteDataAdapter("SELECT GaugeMan,Dateandtime, CompondRubber,GSthickness,WSthicknes FROM thickness WHERE CompondRubber = '" + comboBoxcompondrubber.Text.Trim() + "'", conn123);
dt = новый DataTable();
ПДД.Заполнить(ДТ);
dataGridView1.Источник данных = ДТ;
conn123.Рядом();
}