0

введите сюда описание изображения

Я новичок в работе с бд на C#. Ошибка возникает при попытке добавить данные в бд. На других формах тот же самый код работает без проблемвведите сюда описание изображения

private void button1_Click(object sender, EventArgs e)
{
    string number = textBox1.Text;
    string fio = textBox2.Text.ToString();
    string gr = comboBox1.SelectedItem.ToString();    
    string text = "insert into students(nomer, fio, group) VALUES('number','" + 
    fio + "','" + gr + "')";
    OleDbCommand data = new OleDbCommand(text, myConnection);
    data.ExecuteNonQuery();
}
Yaroslav
  • 1,887
N1993A
  • 27
  • 2
    выложите текст кода, а не его картинку! – Monomax Nov 29 '18 at 05:52
  • уберите ToString() – Monomax Nov 29 '18 at 05:53
  • уберите "'" у number! – Monomax Nov 29 '18 at 05:56
  • @Monomax, а мы же до конца не знаем, схему таблицы. Может у него Number-это строка... – iluxa1810 Nov 29 '18 at 06:01
  • 1 поле тип строка – N1993A Nov 29 '18 at 06:03
  • тогда у вас нет разницы между номером и фамилией, а значит нет уникальности данных. – Monomax Nov 29 '18 at 06:05
  • а можно увидеть проект таблицы куда вносятся данные? – Monomax Nov 29 '18 at 06:08
  • поменял название поле таблицы на другое имя. Название group принимал как ключевое – N1993A Nov 29 '18 at 06:28
  • используйте $ перед строкой будет удобнее читать что то типа $"insert into students(nomer, fio, group) VALUES('{number}','{fio}', '{group}')"; – Саске Nov 29 '18 at 08:20
  • используй Entity Framework для доступа к базам, проверяй валидность строк через RegEx, например. в самих полях ввода ограничь вводимые символы – dgzargo Nov 29 '18 at 16:08

3 Answers3

2
  1. Вставь код вместо картинки.
  2. Не уверен, но слово Group может расцениваться, как ключевое => экранируй его через [ и ]. Может еще и number.
  3. Вставка параметров напрямую в запрос- это плохой тон и прямой путь к SQL-инъекции. Если пользователь введет что-то с '' в полях, то все поломается. Почитай про параметризованные запросы.
  4. Если это не поможет, то в дебаге возьмите из переменной Text текст запроса и выполните его в Access и он подсветит место, где косяк.
iluxa1810
  • 24,899
  • судя по картинке, как раз группа то и проходит нормально. – Monomax Nov 29 '18 at 06:05
2

если учесть замечания 3 от @iluxa1810 как то так будет безопасней

Синхроничная версия метода:

    public void Insert(String connectionString)
    {
        var number = textBox1.Text;
        var fio = textBox2.Text;
        var gr = comboBox1.SelectedItem.ToString();

        using (var connection = new OleDbConnection(connectionString))
        {
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "INSERT INTO STUDENTS (number, fio, group) VALUES(@number,  @fio, @gr)";
                command.Parameters.AddRange(new OleDbParameter[] 
                {
                    new OleDbParameter("@number", number),
                    new OleDbParameter("@fio", fio),
                    new OleDbParameter("@gr", gr)
                });

                connection.Open();
                command.ExecuteNonQuery();
            }    
        }   
    }

Асинхронная версия метода:

    public async void InsertAsync(String connectionString)
    {
        var number = textBox1.Text;
        var fio = textBox2.Text;
        var gr = comboBox1.SelectedItem.ToString();

        using (var connection = new OleDbConnection(connectionString))
        {
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "INSERT INTO STUDENTS (number, fio, group) VALUES(@number,  @fio, @gr)";
                command.Parameters.AddRange(new OleDbParameter[]
                {
                    new OleDbParameter("@number", number),
                    new OleDbParameter("@fio", fio),
                    new OleDbParameter("@gr", gr)
                });

                await connection.OpenAsync();
                await command.ExecuteNonQueryAsync();
            }  
        }
    }
Yaroslav
  • 1,887
  • 2
    Слишком сложна... Я бы убрал бы асинхронность. Так как может быть ТС только начал изучать язык, а тут мы ему сразу показываем высокоуровневые конструкции, которые могут ввести в ступор. – iluxa1810 Nov 29 '18 at 06:54
  • в общем, сложновато, за то эффективно) сейчас поправлю – Yaroslav Nov 29 '18 at 07:13
  • 2
    Не спорю, но вопрос не об этом. Можно было еще написать "WinForms фигня, вот делай на WPF".:) – iluxa1810 Nov 29 '18 at 07:24
  • Минус за такую асинхронность. Нахрена тут Task.Run? | OpenAsync и ExecuteReaderAsync без await'а - facepalm... – Alexander Petrov Nov 29 '18 at 14:12
  • ToString у свойств Text не нужны. Хоть это и не ошибка, но всё же. – Alexander Petrov Nov 29 '18 at 14:16
  • @Alexander Petrov, я знаю, просто это копи паст, того что автор выложил) – Yaroslav Nov 29 '18 at 14:30
  • @AlexanderPetrov, а что не так с асихнронностью? Запустили новый Task и вернули управление, а в вызывающем коде продолжили какую-то работу и когда нам нужен результат повесили await. Не так часто использовал asyn/await. – iluxa1810 Nov 29 '18 at 14:51
  • Хотя... Вроде, тут https://stackoverflow.com/questions/18013523/when-correctly-use-task-run-and-when-just-async-await вычитал. Реальный Task имеет смысл делать, когда CPU-BOUND операция работает, а у нас тут IO. Так? – iluxa1810 Nov 29 '18 at 14:55
  • @iluxa1810 - Да, Task нужен для CPU-bound операций. А в данном случае имеются настоящие IO-bound методы OpenAsync/ExecuteReaderAsync - вот на них и нужно await'ить. – Alexander Petrov Nov 29 '18 at 14:57
  • Task.Run Etiquette - полезная ссылка. @iluxa1810 – Alexander Petrov Nov 29 '18 at 14:59
  • @AlexanderPetrov, а что за Task'и возвращают OpenAsync и ExecuteReaderAsync? Ведь там же, по идее за кулисами вызывается такой же Task.Run, который породит потоки. Единственное только скорее всего они возьмутся из пула. – iluxa1810 Nov 29 '18 at 15:04
  • @iluxa1810 - CPU-bound - создается поток. IO-bound - настоящего потока нет, будет аппаратное ожидание на портах IOCP. https://ru.stackoverflow.com/q/662902/184217 – Alexander Petrov Nov 29 '18 at 15:09
  • @Alexander Petrov, спасибо за коммент, я этим вопросом никогда даже не задавался) – Yaroslav Nov 30 '18 at 06:18
  • @AlexanderPetrov, исправил замечания Минус за такую асинхронность. Нахрена тут Task.Run? | OpenAsync и ExecuteReaderAsync без await'а - facepalm... теперь должно быть все норм. – Yaroslav Dec 02 '18 at 14:16
  • В обеих версиях: command обернуть в using, использовать ExecuteNonQuery(Async). – Alexander Petrov Dec 02 '18 at 14:28
  • @AlexanderPetrov, а что это нам дает ExecuteNonQuery(Async) – Yaroslav Dec 02 '18 at 15:20
  • Insert не возвращает данные, поэтому не нужен reader. – Alexander Petrov Dec 02 '18 at 15:36
  • @AlexanderPetrov, а понял. Получается маленькая оптимизация) – Yaroslav Dec 02 '18 at 15:40
0

У вас не правильно сформулирован запрос на вставку, если вы не хотите делать параметризованный запрос в БД, то исправьте код:

string text ="insert into students (number,fio,group) VALUES('"+number+"','"+fio+"','"+gr+"')";

Драйвер БД ругается на совпадения номера с фамилией!

Monomax
  • 489