ОШИБКА Visual C#.NET: в System.Data.dll произошло необработанное исключение типа «System.Data.OleDb.OleDbException».

Всем добрый день. Я новичок в визуальном c#.net. Я использую OleDb для базы данных MS Access. У меня проблемы с вставкой данных в базу данных MS Access, я не знаю, что здесь не так. В моей теории, как плохо построен мой алгоритм. Я продолжал получать эту ошибку исключения OleDb: «Дополнительная информация: синтаксическая ошибка в инструкции INSERT INTO».

вот мои коды:

У меня есть 3 поля в моей таблице базы данных, которая называется «usersTable». А именно: имя_пользователя, пароль и тип_пользователя.

adduser.cs

примечание: я продолжал получать сообщение об ошибке в этой строке кода global.da.Update(global.ds1, "usersTable");

using System;
using System.Data;
using System.Data.OleDb;

private void dbConnect()
    {
        global.sconn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source = D:/c# programs/soer_final/User.accdb";
        global.dbConn = new OleDbConnection(global.sconn);
        global.dbCmd.Connection = global.dbConn;
        global.dbCmd.CommandText = "Select * from usersTable";
        global.da.SelectCommand = global.dbCmd;
        global.dbConn.Open();
        global.ds1.Clear();
        global.da.Fill(global.ds1, "usersTable");
    }

 private void SaveButton_Click(object sender, EventArgs e)
        {
            try { 
                dbConnect();
                DataRow dRow = global.ds1.Tables["usersTable"].NewRow();
                dRow[0] = user_name.Text;
                dRow[1] = password.Text;
                dRow[2] = user_type.Text;


                global.ds1.Tables["usersTable"].Rows.Add(dRow);
                global.da.Update(global.ds1, "usersTable");
                global.dbConn.Close();
                MessageBox.Show("User added");
            }
           catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

Program.cs

using System.Data;
using System.Data.OleDb;

public class global
{
    public static string sconn;
    public static OleDbConnection dbConn;
    public static OleDbDataAdapter da = new OleDbDataAdapter();
    public static OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
    public static OleDbCommand dbCmd = new OleDbCommand();
    public static DataSet ds1 = new DataSet();
    public static DataRow[] foundrow;
}

person oakleg    schedule 23.03.2017    source источник


Ответы (1)


Вам нужно изменить строку, в которой вы создаете OleDbCommandBuilder.

OleDbCommandBuilder cb = new OleDbCommandBuilder(da) 
{ QuotePrefix = "[", QuoteSuffix = "]"};

Это заставит OleDbCommandBuilder заключать имена полей сгенерированных команд (для операций обновления, вставки и удаления) в квадратные скобки. В свою очередь, это позволяет избежать синтаксической ошибки, вызванной использованием зарезервированного ключевого слова в именах столбцов (ПАРОЛЬ).

Конечно, вы также можете изменить имя этого столбца и раз и навсегда удалить источник вашей проблемы.

Кстати, я настоятельно рекомендую не использовать глобальный класс, чтобы поддерживать все эти переменные на протяжении всей жизни вашей программы. Они будут постоянным источником проблем для вашей программы. Соединение не закрыто и удалено, команда с предыдущими параметрами и текстом использования, адаптер, который меняет свою конфигурацию и так далее. Лучше создавать экземпляры этих объектов, когда они вам нужны, а затем уничтожать их. Не большая стоимость с точки зрения производительности

person Steve    schedule 23.03.2017
comment
ну, я чувствовал себя глупо, ха-ха, твой ответ решил мою проблему. Извините, я не знал, что пароль является зарезервированным ключевым словом. Большое спасибо за помощь в моей проблеме, чувак. Ты восхитителен! Удачного дня! - person oakleg; 23.03.2017