Обновление базы данных MDB в реальном времени через datagridview

В настоящее время я пытаюсь создать небольшую программу, которая берет данные из базы данных MDB, которая отображается в виде сетки данных. Программа должна позволять пользователю изменять (добавлять, обновлять, удалять) данные в datagridview. Кроме того, все должно автоматически обновляться в MDB (без кнопок). Я знаю, что есть много тем по этому вопросу, однако по какой-то причине я не могу воспроизвести те же результаты.

Я могу получить данные из файла MDB и отобразить их в datagridview, но я не могу добавлять, изменять или удалять данные. Программа продолжает бросать мне исключения, но я не понимаю, почему.

Сначала пользователь должен создать базу данных. База данных генерируется автоматически по коду.

private void CreateNewDatabase_Click(object sender, EventArgs e)
{
    string DB_FILENAME = "c:\Test.mdb";

    // GENERATE THE ACCESS FILES, ITS TABLES AND ITS COLUMNS

    var cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0.;Data Source=" + DB_FILENAME; //Use a late bound COM object to create a new catalog. This is so we avoid an interop assembly
    var catType = Type.GetTypeFromProgID("ADOX.Catalog");
    object o = Activator.CreateInstance(catType);
    catType.InvokeMember("Create", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] { cnnStr });
    OleDbConnection cnn = new OleDbConnection(cnnStr);
    cnn.Open();
    var cmd = cnn.CreateCommand();

    // CREATE SCHEDULE TABLE
    cmd.CommandText = "CREATE TABLE SCHEDULE ([ID] IDENTITY PRIMARY KEY, [Day] TEXT, [Month] TEXT, [Year] TEXT, [IMS] TEXT, [Customer] TEXT, [Short Description] TEXT, [Long Description] TEXT, [Delivery Ticket Number] TEXT, [Returned] TEXT)";
    cmd.ExecuteNonQuery();

    cmd.CommandText = "INSERT INTO SCHEDULE ([ID]) VALUES (1)";
    cmd.ExecuteNonQuery();

    // DISPOSE OF THE VARIABLES USED
    cnn.Close();
    cnn.Dispose();
    cmd.Dispose();

}

После создания базы данных она используется в форме окна с представлением данных в ней.

public void Initialize()
{

    Con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sttngs.DBloc);
    Con.Open();

    // TRY TO OPEN THE DATABASE FILE AND POPULATE THE DATAGRIDVIEW
    da = new OleDbDataAdapter("SELECT [Day], [Month], [Year], [IMS], [Customer], [Short Description], [Long Description], [Delivery Ticket Number], [Returned] FROM SCHEDULE",Con); // WHERE [Returned] = '" + "NO' ", Con);

    // POPULATE cBuilder
    cBuilder = new OleDbCommandBuilder(da);
    ScheduleData = new DataTable();
    da.Fill(ScheduleData);

    if (ScheduleData.Rows.Count > 0)
    {
       BindingSource BDS = new BindingSource();
       BDS.DataSource = ScheduleData;
       this.dataGridView.DataSource = BDS;        
    }
}

После изменения данных в datagridview (обрабатывается событием CellValidating) данные должны быть обновлены в MDB.

 private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
 {
     if (ScheduleData.GetChanges() != null)
     {
        dataGridView.EndEdit();
        da.Update(ScheduleData);
        ScheduleData.AcceptChanges();
     }
 }

Код довольно прост, но по какой-то причине я не могу понять, почему данные в MDB не обновляются. Я застрял на некоторое время, так что любая помощь будет здорово!


person user2118930    schedule 28.02.2013    source источник


Ответы (1)


Одна вещь, которую я вижу, которая вызовет проблему, заключается в том, что при настройке вашего построителя команд вы не запрашиваете соответствующие команды UPDATE, DELETE и INSERT.

Когда вы создаете построитель команд следующим образом: -

cBuilder = new OleDbCommandBuilder(da);

Следите за: -

cBuilder.GetUpdateCommand();
cBuilder.GetInsertCommand();
cBuilder.GetDeleteCommand();

Возможно, вам придется объявить все это в Cell Validating, я не уверен. Попробуйте.

Просмотрите эту статью MSDN, это для SQLcommamdbuilder, но применяются те же правила: -

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx

Кроме того, у вас нет открытого подключения к адаптеру данных, когда вы пытаетесь его обновить: -

if (ScheduleData.GetChanges() != null)
     {
        dataGridView.EndEdit();

        //Open a connection Here
        da.Update(ScheduleData);

        ScheduleData.AcceptChanges();
     }

Ваша строка SQL неверна, попробуйте: -

"SELECT (Day, Month, Year, IMS, Customer, Short Description, Long Description, Delivery Ticket Number, Returned) FROM [SCHEDULE]"
person Derek    schedule 28.02.2013
comment
Дерек, моя связь открыта, потому что я сделал это общедоступным. Он открывается внутри процедуры инициализации и закрывается при закрытии формы. - person user2118930; 28.02.2013
comment
Я также пытался реализовать команды обновления, вставки и удаления, но это все еще не работает. Он просто вылетает и говорит, что не может выполнить синтаксис обновления. Любые другие предложения? - person user2118930; 28.02.2013