Ошибка OleDBException INSERT

Я создаю приложение С#, в котором вы можете войти в систему и зарегистрировать новую учетную запись. Но когда я нажимаю на кнопку «Новая учетная запись» и заполняю необходимые поля, я получаю следующую ошибку:

vcom.ExecuteNonQuery(); -> OleDBException не было обработано. Инструкция INSERT содержит синтаксическую ошибку.

См. ниже наш код:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace Eindopdracht
{
    public partial class maak_account : Form
    {

        OleDbConnection vcon = new OleDbConnection(@"provider= microsoft.jet.oledb.4.0;data source=sample.mdb");

        public maak_account()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OleDbConnection vcon = new OleDbConnection(@"provider= microsoft.jet.oledb.4.0;data source=sample.mdb");
            vcon.Open();

            string test = string.Format("insert into inlog (PASSWORD, Username, leeftijd, gewicht) VALUES ('" + textBox2.Text + "','" + textBox1.Text + "','" + textBox3.Text + "','" + textBox4.Text + "')");
            OleDbCommand vcom = new OleDbCommand(test, vcon);
            vcom.ExecuteNonQuery();
            MessageBox.Show("Uw gegevens zijn opgeslagen");
            vcom.Dispose();
        }
    }
}

person haassiej    schedule 27.03.2013    source источник
comment
Золотой совет № 1: используйте параметры вместо сравнения строк для создания запроса.   -  person Frederik Gheysels    schedule 27.03.2013


Ответы (2)


Причина синтаксической ошибки в том, что Password, являющееся именем столбца, является зарезервированным ключевым словом.

insert into inlog ([PASSWORD], Username, leeftijd, gewicht)

Из документов MS Access,

Если зарезервированное слово уже используется, вы можете избежать сообщений об ошибках, заключив каждое вхождение слова в квадратные скобки ([ ]). Однако лучшим решением будет изменить имя на незарезервированное слово.

Чтобы еще больше улучшить код,

  • используйте оператор using для правильного удаления объекта
  • используйте try-catch для правильной обработки исключений
  • параметризовал значения, чтобы избежать инъекции sql

пример,

string connStr = @"provider= microsoft.jet.oledb.4.0;data source=sample.mdb";
string test = "insert into inlog ([PASSWORD], Username, leeftijd, gewicht) VALUES (?, ?, ?, ?)";

using(OleDbConnection vcon = new OleDbConnection(connStr))
{
    using(OleDbCommand vcom = new OleDbCommand(test, vcon))
    {
        vcom.Parameters.AddWithValue("PASSWORD", textBox2.Text);
        vcom.Parameters.AddWithValue("Username", textBox1.Text);
        vcom.Parameters.AddWithValue("leeftijd", textBox3.Text);
        vcom.Parameters.AddWithValue("gewicht", textBox4.Text);
        try
        {
            vcon.Open();
            com.ExecuteNonQuery();
        }
        catch(OleDbException ex)
        {
            // do something with the exception
        }
    }
}
person John Woo    schedule 27.03.2013

Используйте блок try/catch, чтобы перехватить исключение и просмотреть сообщение об ошибке. Также распоряжайтесь своими ресурсами в блоке finally. Блок finally будет выполняться всегда, даже если возникнет исключение.

try
{
    OleDbConnection vcon = new OleDbConnection(@"provider= microsoft.jet.oledb.4.0;data source=sample.mdb");
    vcon.Open();

    string test = string.Format("insert into inlog (PASSWORD, Username, leeftijd, gewicht) VALUES ('" + textBox2.Text + "','" + textBox1.Text + "','" + textBox3.Text + "','" + textBox4.Text + "')");
    OleDbCommand vcom = new OleDbCommand(test, vcon);
    vcom.ExecuteNonQuery();
    MessageBox.Show("Uw gegevens zijn opgeslagen");
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    vcom.Dispose();
    vcon.Close();
    vcon.Dispose();
}
person Abbas    schedule 27.03.2013