2011-10-31 14 views
0

私は確かに典型的な状況です。なぜ私のマージは機能しませんか?

私はDBを持っており、私はデータのXML文書を持っています。私は2を組み合わせてdbを更新したいと思います。

私は、データセットおよび/またはDataTableにDBデータを埋め込み、その構造内のデータを変更すると、私は更新を呼び出すことができ、すべてがうまくいきます。

これは私が持っているものです。

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になり、それらを結合しています。マージしていないことに気付きました。アー!

詳細私がdbdt.GetChanges()を呼び出した場合、それは全体のロットを返します。私が変更を受け入れてもそれを更新すれば、何もしません。

+0

私はそれを得ることはありません。どのようにこれはとても難しいことができます、これは典型的な問題でなければなりませんか?私がインポートしようとしているXMLは、調整されているデータセットの「WriteXML」バージョンです。フォーマット上の問題ではないようです。 –

答えて

1

あなたはUpdateの代わりに、この行のFill呼び出す必要があります:あなたはすでに存在しているキーを挿入している
:質問を更新した後

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

を。マージは、アダプタを更新する必要があるときに挿入する必要があることをアダプタに通知するか、またはDBフィルがすべての行を返さないように指示します。与えられたものを伝えるのは難しい。

これはややハックのようですが、更新とみなされる行がわかっている場合は、SetModifiedと呼んでください。

+0

ああ、今私がしたことを覚えています。次のようなことがあります:PRIMARY KEY制約 'PK_BASIC'の違反。オブジェクト 'dbo.BASIC'に重複キーを挿入できません。 –

+0

さらに更新しました。 Mergeは、すべての行をNEWであり、UPDATEDではないと報告しているようです。どうしてあなたは確かに見る必要がありますか?本当にそれほど多くはありません.. –

+0

@JonH:私は私の答えを更新しました。私はあなたのために良い解決策を持っていません。 –

関連する問題