Невозможно добавить DataTable в таблицу MS Access

У меня есть DataTable с примерно 6000 строками, созданными из запроса к базе данных SQL Server. Теперь я пытаюсь добавить данные в таблицу MS-Access. Кажется, все работает. Никаких исключений не возникает, но данные не добавляются. Вот код, который я использую:

DataTable t = new DataTable();
// fill data table


// Create DB - works!
var Name = DateTime.Now.ToString("H_mm_ss");

string strAccessConnectionString = @"Provider = Microsoft.Jet.OLEDB.4.0;" +
                                    @"Data Source=" + "C:\\chhenning\\" + Name + ".mdb;";

ADOX.CatalogClass Catalog = new ADOX.CatalogClass();
Catalog.Create(strAccessConnectionString);

OleDbConnection accessConnection = new OleDbConnection(strAccessConnectionString);
accessConnection.Open();

// Create Table - works!
OleDbCommand Command = accessConnection.CreateCommand();

Command.CommandText = "Create Table Test( "
    + " ID_ int not null "
    + " , Year_ int not null "
    + " , Value_ float not null )";

Command.ExecuteNonQuery();

// Add data into table - does not work!
var adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand("select * from Test", accessConnection);

var cbr = new OleDbCommandBuilder(adapter);
cbr.GetInsertCommand();

var Rows = adapter.Update(t);

Я убедился, что в моем DataTable есть данные и что и DataTable, и MS-Access имеют одни и те же столбцы с одинаковыми типами данных.

Может кто-нибудь заметить, что не так с кодом? Какие шаги я предприму для дальнейшего изучения проблемы?


person chhenning    schedule 31.05.2013    source источник


Ответы (1)


Метод adapter.Update(table) работает с учетом RowState. строк в DataTable.
Если строки имеют RowState == DataRowState.Unchanged, метод не будет выполнять никакого обновления.

Я предполагаю, что вы загружаете данные из базы данных SqlServer без каких-либо изменений, и поэтому RowState не изменяется для каждой строки. Попробуйте зациклиться на строках и вызвать

foreach(DataRow r in t.Rows)
    r.SetAdded();

Это заставит RowState для каждого столбца добавиться, а затем InsertCommand в DataAdapter выполнит вставку.

person Steve    schedule 31.05.2013
comment
Это, кажется, продвигает меня на шаг вперед. Теперь я получаю InvalidOperationException. Генерация динамического SQL для UpdateCommand не поддерживается для SelectCommand, который не возвращает информацию о ключевом столбце. Нужен ли мне первичный ключ? - person chhenning; 31.05.2013
comment
Да, CommandBuilder нуждается в этом. Или напишите свою собственную InsertCommand для DataAdapter - person Steve; 31.05.2013
comment
Хорошо, я добавил первичный ключ в свой первый столбец, и когда я обновляю возвращаемое значение адаптера. Обновление () верно. Но когда я открываю файл mdb в MS-Access, данных все равно нет. - person chhenning; 31.05.2013
comment
Моя вина, вам нужно SetAdded добавить не SetModified - person Steve; 31.05.2013