Бд в C# через access [закрыт]

159
16 мая 2019, 14:50

Я новичок в работе с бд на 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();
}
Answer 1
  1. Вставь код вместо картинки.
  2. Не уверен, но слово Group может расцениваться, как ключевое => экранируй его через [ и ]. Может еще и number.
  3. Вставка параметров напрямую в запрос- это плохой тон и прямой путь к SQL-инъекции. Если пользователь введет что-то с '' в полях, то все поломается. Почитай про параметризованные запросы.
  4. Если это не поможет, то в дебаге возьмите из переменной Text текст запроса и выполните его в Access и он подсветит место, где косяк.
Answer 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();
            }  
        }
    }
Answer 3

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

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

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

READ ALSO
Пользовательский элемент из класса

Пользовательский элемент из класса

Есть тут люди которые помогут разобраться с созданием кастомных элементов для WPF C#?

163
Entity Framework работа с тяжелыми таблицами

Entity Framework работа с тяжелыми таблицами

У меня есть таблица городов около 25 миллионов записей (весит 2гб) и если в SQL запрос выполняется моментально по поиску, то Entity Framework начинает...

118
Получить ответ от сайта c помощью Cefsharp

Получить ответ от сайта c помощью Cefsharp

Добавил стандартное окно браузера от Cefsharp, пытаюсь авторизоваться на сайте и получить ответ при помощи IRequestHandler, но в итоге из за OnBeforeResourceLoad...

138
C# WPF Как создать свой User Control со списком внутри?

C# WPF Как создать свой User Control со списком внутри?

Хочу сделать TreeView но в таком виде и с нуля

156