Member 13809133 Ответов: 2

Ошибка SQL междометие столкнулся


private void button1_Click(object sender, EventArgs e)
    {
        if (comboBoxstaff.Text == string.Empty)
        {
            MessageBox.Show("Please Select gaugeman");  // not to let thecombobox empty
            return;
        }
        else if (comboBoxcompondrubber.Text == string.Empty)
        {
            MessageBox.Show("Please Select Compond Rubber");// not to let thecombobox empty
            return;

        }
        else if (textBox1.Text == string.Empty)
        {
            MessageBox.Show("Please Key in W.S thickness");// not to let thetextbox empty
            return;

        }
        else if (textBox2.Text == string.Empty)
        {
            MessageBox.Show("Please Key in G.S thickness");// not to let thecombobox empty

        }
        SQLiteConnection insertsess = new SQLiteConnection("Data Source=|DataDirectory|\\test1db");
        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();
        MessageBox.Show("Data had been saved");// showed when the message is being saved

        SQLiteConnection sesscheck = new SQLiteConnection("Data Source=|DataDirectory|\\test1db");
        SQLiteCommand chk1;
        chk1 = sesscheck.CreateCommand();
        chk1.CommandText = "SELECT GaugeMan,Dateandtime, CompondRubber,GSthickness,WSthicknes FROM thickness WHERE CompondRubber = '" + comboBoxcompondrubber.Text.Trim() + "'";
       sesscheck.Open();
        DataTable thicknessTable = new DataTable();
        //DataTable thicknessTable = new DataTable();
        SQLiteDataReader reader = chk1.ExecuteReader();
        thicknessTable.Load(reader);
        //SQLiteDataReader reader1 = chk2.ExecuteReader();
        //thicknessTable.Load(reader1);
        sesscheck.Close();

        dt = new DataTable();
        sda.Fill(dt);
        dataGridView1.DataSource = dt;

    }


Что я уже пробовал:

I had tried using data adapter but it didn't work I tried using data reader but I am not sure on how to go about using it properly.

I want to get the value 12.0 to be saved and displayed into data grid view at the moment if I key 12.1 it also works only like 12.0 it will be entered and displayed as 12 at the data grid view

2 Ответов

Рейтинг:
2

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.Рядом();



}

OriginalGriff

Нет, потому что имена параметров не совпадают с именами в операторе INSERT. И второй набор кода все еще уязвим.
Кроме того, вы открываете соединение, используете его, закрываете, создаете новое, открываете его ... что просто глупо.
Прочтите то, что я сказал об "использовании" блоков, и также не создавайте жесткий код строк подключения.

Рейтинг:
2

CHill60

Поднимая другую проблему, о которой Вы упомянули

Цитата:
Я хочу чтобы значение 12.0 было сохранено и отображено в представлении таблицы данных в данный момент если я нажму клавишу 12.1 оно также работает только как 12.0 оно будет введено и отображено как 12 в представлении таблицы данных
Дисплей не имеет ничего общего с тем, как хранится номер или как вы получаете его обратно из базы данных. Вы должны сообщить об этом dataGridView как отобразить ее.

Например, щелкните правой кнопкой мыши dataGridView1 и установите для defaultCellStyle соответствующего столбца(столбцов) значение "N2" (числовое).

Это предполагает, что вы храните информацию в базе данных в числовом, нецелочисленном типе столбца. Если нет, то вам нужно изменить схему таблицы таким образом, чтобы типы столбцов соответствовали типу данных, которые вы хотите в них хранить.