2013-03-27 2 views
2

Я создаю приложение C#, где вы можете войти в систему и зарегистрировать новую учетную запись. Но когда я нажимаю на свою новую учетную запись и заполняю необходимые поля, я получаю следующую ошибку:Ошибка 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(); 
     } 
    } 
} 
+1

Golden tip nr 1: использовать параметры вместо строки concat для создания запроса. –

ответ

2

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

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

С MS Access Документах

If a reserved word is already in use, you can avoid error messages by surrounding each occurrence of the word with brackets ([ ]). However, the best solution is to change the name to a nonreserved word.

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

  • использование using заявление правильно распоряжаться объект
  • использовать try-catch правильно обрабатывать исключения
  • параметрироваться значения, чтобы избежать SQL Injection

пример,

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 
     } 
    } 
} 
0

использования попробовать/поймать блок поймать исключение и увидеть ошибку ormessage. Также утилизируйте свои ресурсы в блоке 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(); 
}