Как мне получить этот DataSet для добавления новых строк и корректного обновления? - PullRequest
1 голос
/ 22 сентября 2010

Я новичок в C # и .NET в целом, пришла из опыта FLOSS (в основном PHP, Python и Ruby). Я использовал мастер настройки источника данных для подключения к файлу MDB (к сожалению, это необходимо сделать, поскольку приложение, с которым он используется, было написано более 5 лет назад и в настоящее время является приложением VB6, подключающимся к базе данных Access). Мастер создал класс DataSet JobDataSet со следующими таблицами данных (среди прочих): ItemType, Item. ItemRevision

В MDB они соответствуют следующим таблицам:

ItemRevisions (
  ID: AutoNumber PK,
  JobNo: Text, 
  ItemTypeID: Number, 
  ItemNo: Number, 
  RevisedAt: Date/Time, 
  RevisedBy: Text, 
  ItemID: Number
)
Items (
  ID: AutoNumber PK, 
  JobNo: Text, 
  ItemTypeID: Number, 
  ItemNo: Number
)
ItemTypes: (
  ID: AutoNumber PK, 
  Type: Text
)

В любом случае, следующий код для метода, который не работает:

private void AddJobItem()
{
    itemTypesBindingSource.EndEdit();
    JobDataSet.ItemsRow itemsRow = jobDataSet.Items.NewItemsRow();
    itemsRow.ItemTypeID = long.Parse(comboBoxItemType.SelectedValue.ToString());
    itemsRow.JobNo = JobNo;
    itemsRow.ItemNo = (long)numericUpDownItemNo.Value;
    jobDataSet.Items.Rows.Add(itemsRow);
    jobDataSet.Items.AcceptChanges();
    itemsTableAdapter.Update(jobDataSet.Items);
    JobDataSet.ItemRevisionsRow itemRevisionsRow = jobDataSet.ItemRevisions.NewItemRevisionsRow();
    itemRevisionsRow.ItemTypeID = long.Parse(comboBoxItemType.SelectedValue.ToString());
    itemRevisionsRow.JobNo = JobNo;
    itemRevisionsRow.ItemNo = (int)numericUpDownItemNo.Value;
    itemRevisionsRow.RevisedAt = System.DateTime.Now;
    itemRevisionsRow.RevisedBy = Program.AuthForm.Username;
    itemRevisionsRow.ItemID = itemsRow.ID;
    jobDataSet.ItemRevisions.Rows.Add(itemRevisionsRow);
    jobDataSet.ItemRevisions.AcceptChanges();
    itemRevisionsTableAdapter.Update(jobDataSet.ItemRevisions);
    jobDataSet.AcceptChanges();
}

По сути, проблема в том, что все настроено должным образом в том, что касается свойств объекта (проверил это, пошагово пройдя через отладчик и просмотрев значения рассматриваемых объектов), исключений не выдается. Но первичные ключи остаются -1 вместо установки фактического идентификатора базы данных, и данные никогда фактически не добавляются в таблицы. Я уверен, что здесь упущено что-то простое (как я уже говорил, новинка для этого, первое приложение с отключенным слоем ADO.NET), поэтому, если кто-нибудь сможет помочь, оно будет оценено.

1 Ответ

2 голосов
/ 22 сентября 2010

BY вызывая AcceptChanges перед использованием адаптера, вы в основном говорите, что все данные в наборе данных являются неизменными и текущими. Следовательно, адаптер ничего не будет делать. Не вызывайте AcceptChanges перед запуском его через БД, только если операция БД завершается, имеет смысл «AcceptChanges»

...