2011-09-18 15 views
-5

DataAdapterを使用して、プライマリキーを持つテーブルからDataSetを入力しています。ADO.NET DataSetプライマリキー違反

プライマリキー列の値を別の行に既に存在する値に変更すると、プライマリキー違反エラーは発生しません。

プライマリキーの値が重複するように行を変更した後にDataSet.AcceptChanges()を呼び出すと、プライマリキー違反エラーは発生しません。

これはなぜですか?そのようなあなたは、ソースからの根本的なスキーマについてDataSetを伝える必要があり、主キー制約など何らかの制約を強制するために

string sqlcommand = "select * from itemmaster";//itemaster contains id field which is primary key// 

SqlConnection cn = new SqlConnection(connstring); 
cn.Open(); 
SqlCommand cmd = new SqlCommand(sqlcommand, cn); 

SqlDataAdapter da = new SqlDataAdapter(cmd); 

DataSet ds = new DataSet(); 
da.Fill(ds); 

ds.Tables[0].Rows[4]["ID"] = "2"; // value 2 already exists in another row 
+2

、なぜあなたは 'DataSet'sの代わりに、ORMで開発を行っていますか? –

+0

http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-postsを参照してください。 –

+4

また、コードを表示すると、より良い回答が得られます。問題を示す小さな例を作成し、ここに例を投稿してください。 –

答えて

2

。これはあなたのDataSetを充填する前FillSchema()メソッドを使用し実行するには:

da.FillSchema(ds, SchemaType.Source); 
da.Fill(ds); 

DataSetすると、データの単なる切断セットです。

データセットから行を挿入、更新、または削除すると、データベースを直接更新することはありません。これらの変更を切断されたデータセットにコミットするだけです。つまり、あなたがこれを行うとき:

ds.Tables[0].Rows[4].Delete(); 
ds.AcceptChanges(); 

あなたはここに行ってきたすべてがTable[0]から行を削除してからDataSetでその変化はなく、データベース自体をコミットしています。この変更をデータベース自体にコミットするには、別の処理を行う必要があります。

DataAdapterに「削除コマンド」を追加する必要があります。例として、あなたのコードを使用する:

string sqlcommand = "select * from itemmaster";//itemaster contains id field which is primary key// 

SqlConnection cn = new SqlConnection(connstring); 
cn.Open(); 
SqlCommand cmd = new SqlCommand(sqlcommand, cn); 

SqlDataAdapter da = new SqlDataAdapter(cmd); 
SqlCommand deleteCmd = new SqlCommand("DELETE FROM itemmaster WHERE ID = @ID", cn); 
SqlParameter deleteParam = deleteCmd.Parameters.Add("@ID", SqlDbType.Int, 4, "ID"); 
deleteParam.SourceVersion = DataRowVersion.Original; 
da.DeleteCommand = deleteCmd; 

DataSet ds = new DataSet(); 
da.FillSchema(ds, SchemaType.Source, "itemmaster"); 
da.Fill(ds, "itemmaster"); 

ds.Tables[0].Rows[4].Delete(); 

da.Update(ds, "itemmaster"); 

詳細情報については以下を参照してください。好奇心のうち

Updating Data Sources with DataAdapters

+0

あなたの有益な情報に感謝Kev – funsukvangdu