Строго типизированный набор данных: как сохранить данные на БД после добавления данных? - PullRequest
0 голосов
/ 05 мая 2011

Я знаю, что это глупый вопрос, и я чувствую себя так глупо , но я не могу найти правильный (простой) способ выполнить мою задачу.
У меня есть база данных Access, импортированная вVisual Studio 2010 для проекта C #: VS создает для меня (спасибо !!) набор данных со строгим контролем типов для моей базы данных.Отлично.
Затем в своем приложении я создаю новый экземпляр этого набора данных CDS ds = new CDS(); и добавляю записи в его таблицы.Наконец я делаю ds.AcceptChanges();, но ничего не происходит на БД.
ОК, я погуглил гадость и думаю (понимаете?!?) Я должен открыть соединение БД, создать DataAdapter и заполнить свой набор данных этим:

CDS ds = new CDS();
OleDbConnection conn = new OleDbConnection(path_to_db);
conn.Open();
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM mytable", conn);
da.Fill(ds.Editori); //Editori is a TableTable created automatically
// Insert rows in dataset
if (ds.HasChanges()) ds.AcceptChanges();
int ret = da.Update(ds.Editori);
Debug.Print("Update() returns: {0}", ret);
conn.Close();

но ret = 0 и в базе данных ничего не происходит, в то время как в DS.Editori у меня есть 106 строк !!

Чтобы завершить мое отчаяние: таблица mytable имеет поле автоинкремента какосновной ключ;когда я загружаю ds с помощью da, это поле корректно для каждой записи, но когда я вставляю строки в ds, записи имеют -1, -2, -3 и т. д. Почему?

Может кто-то подскажет мнеправильный способ работы со строго типизированными наборами данных?Я собираюсь учиться, читать книги, обещаю, но теперь я опаздываю на эту работу ... Спасибо

ОБНОВЛЕНИЕ:
Как предложено в Dev-Express, я создал вкладышкоманда, но результат тот же: когда я обновляю da, на базе данных ничего не происходит.

OleDbCommand cmd = new OleDbCommand(
    "INSERT INTO Editori (ID,Editore) VALUES(?,?)", conn);
cmd.Parameters.Add("@ID", OleDbType.Integer);
cmd.Parameters.Add("@Editore", OleDbType.VarChar, 255, "Editore");
da.InsertCommand = cmd;
int ret = da.Update(ds.Editori);
Debug.Print("Update() returns: {0}", ret);
conn.Close();

ДРУГОЕ ОБНОВЛЕНИЕ: Я решил проблему с первичными ключами: в сгенерированном классе у меня было вручнуюизменить все эти строки:

this.columnID.AutoIncrementSeed = 1; // It was -1
this.columnID.AutoIncrementStep = 1; // It was -1

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Если вы создали строго типизированный DataSet с помощью дизайнера Visual Studio, в наборе данных или TableManager, созданном для этого DataSet, будет TableAdapters .

MSDN дает следующий пример использования:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
   new NorthwindDataSetTableAdapters.CustomersTableAdapter();
//Fill from database
customersTableAdapter.Fill(northwindDataSet.Customers);
//... changes to table
//Save changes to database
customersTableAdapter.Update(northwindDataSet.Customers);

В качестве альтернативы, если ваш дизайнер Visual Studio создал TableManager:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();
TableAdapterManager northwindTableManager = new TableAdapterManager();

//Fill from database
northwindTableManager.CustomersTableAdapter.Fill(northwindDataSet.Customers);
//... changes to table
//Save changes to database
northwindTableManager.CustomersTableAdapter.Update(northwindDataSet.Customers);
0 голосов
/ 05 мая 2011

Также необходимо указать команду UpdateCommand для OleDBDataAdapter, а затем выполнить ее, вызвав метод da.Update.Вот пример того, как это можно сделать в MSDN:

OleDbDataAdapter.OleDbDataAdapter (String, OleDbConnection) Конструктор

...