Почему не работает мой Merge? - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть, я уверен, типичная ситуация.

У меня есть БД, и у меня есть XML-документ данных. Я хотел бы объединить 2 и обновить БД.

Я «заполнил» DataSet и / или DataTable данными БД, и если я изменю данные в этой структуре, я могу вызвать Update, и все в порядке.

Вот что у меня есть.

con.Open();
adapter.Fill(ds2, "BASIC");
ds.ReadXmlSchema(@"C:\asis.xsd");
ds.ReadXml("c:\\asis.xml");

// This is the XML data
DataTable loadeddt = ds.Tables["BASIC"];

// This is from the DB
DataTable dbdt = ds2.Tables["BASIC"];

// I want to put the data from xml into the dataset from the DB
dbdt.Merge(loadeddt);


// I want to them put those changes in the db
adapter.Fill(dbdt);

Вот что происходит, перед тем как я загрузил XSD, я получил исключение о том, что типы не совпадают.

Теперь я ничего не получаю, без исключений, без изменений. ни DataTable не показывают изменений, ни DB не изменяются.

Может кто-нибудь предложить какие-либо предложения?

Если я изменю последнюю строку на Обновление, я получу следующее:

Нарушение ограничения PRIMARY KEY 'PK_BASIC'. Невозможно вставить повторяющийся ключ в объект 'dbo.BASIC'.

Я заметил, что если вы выполняете .Rows.Count до / после слияния, количество записей увеличивается от 10 до 20, поэтому он объединяет их ... а не объединяет. Argh!

БОЛЬШЕ, если я вызову dbdt.GetChanges (); это возвращает всю партию. если я принимаю изменения и обновляю его, он все равно ничего не делает.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Вы должны позвонить Update вместо Fill для этой строки:

// I want to them put those changes in the db 
adapter.Fill(dbdt);

После обновления вопроса:
Вы вставляетеключ, который уже существует.Либо слияние сообщает адаптеру, что он должен вставить, когда он должен обновиться, либо заполнение БД не возвращает все строки.Трудно сказать, что дано.

Это кажется чем-то вроде хака, но если вы знаете, какие строки следует считать обновлениями, вы можете вызвать SetModified для этих строк.

0 голосов
/ 01 ноября 2011

Правильные парни,

Я нашел эту статью:

http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-ado-net/14201/Merge-function-in-DataSet

По сути, XSD должен полностью описать первичный ключ для работы слияния.

По сути, мне нужно было добавить:

<xs:key name="ROOTKey1"  msdata:PrimaryKey="true">
    <xs:selector xpath=".//BASIC" />
    <xs:field xpath="MEMBNO" />
</xs:key>
...