2016-08-25 7 views
0

私はあなたの助けを求めます。C#既存のテーブルの列にプライマリキーを作成する方法

This constraint cannot be enabled as not all values have corresponding parent values.

:問題は、私は2つのテーブルを関連付けるためにしようとしていますので、私はそれぞれの「ID」列のテーブルの主キーを作成する必要がありますが、私はこの行のエラー

ds.Relations.Add(dr); 

エラーを取得していますということです

=スペイン語で元のエラーはありませんそれ自体puede habilitar ESTArestricción屋QUEトドスロスvaloresなしチーネンロスvalores primarios correspondientes。

私が間違って何をしているのですか?

OdbcDataAdapter sdata = new OdbcDataAdapter("SELECT * FROM componentes WHERE nombre_componente ILIKE '%" + buscar + "%'", conn); 
OdbcDataAdapter sdata2 = new OdbcDataAdapter("SELECT * FROM proveedores WHERE nombre_empresa ILIKE '%" + buscar + "%'", conn); 

DataSet ds = new DataSet(); 

DataTable dtbl = new DataTable("dtbl"); 
DataTable dtbl2 = new DataTable("dtbl2"); 

sdata.Fill(dtbl); 
sdata2.Fill(dtbl2); 

ds.Tables.Add(dtbl); 
ds.Tables.Add(dtbl2); 

dtbl.PrimaryKey = new DataColumn[] { dtbl.Columns["id"] }; 
dtbl2.PrimaryKey = new DataColumn[] { dtbl2.Columns["id"] }; 

DataRelation dr = new DataRelation("provcomp", 
       ds.Tables["dtbl"].Columns["id_prov_comp"], 
       ds.Tables["dtbl2"].Columns["id"]); 

ds.Relations.Add(dr); 
ds.AcceptChanges(); 

ありがとうございます。

+0

私は、人々がプライマリと外部キーの値をC#で使用するのを見たことがありません。彼らは必要なものを得るためにlinqを使用しています。あなたの目標は何ですかなぜこれを正確に必要としますか – Neil

+0

問題はプライマリキーではなく、DataRelationにあります。DataRelationを作成するには、子テーブルのすべての値が親テーブル内にある必要があります。子テーブル(この例ではid_prov_comp)に0(nullではなく)を持つ最も一般的な理由 –

答えて

0

主キーはOKです - あなたはすでに成功し、次の行でそれらを作成しました:

dtbl.PrimaryKey = new DataColumn[] { dtbl.Columns["id"] }; 
dtbl2.PrimaryKey = new DataColumn[] { dtbl2.Columns["id"] }; 

DataRelationに(例外によって示されるように)問題があります。 DataRelationは、データベースFK(外部キー)に相当します。使用コンストラクタのシグネチャは次のようになります。

public DataRelation(
    string relationName, 
    DataColumn parentColumn, 
    DataColumn childColumn 
) 

私はあなたが間違った列を指定された間違っていたものを考える - 表がそれを参照する - parentColumnchildColumnながら、参照されるテーブルを指している必要があります。

に簡単な変更を:

DataRelation dr = new DataRelation("provcomp", 
    ds.Tables["dtbl2"].Columns["id"], 
    ds.Tables["dtbl"].Columns["id_prov_comp"]); 

と彼らは本当に正しく関連している場合、問題は解決されなければなりません。

編集:親テーブルの場合は、子テーブルからすべてのキーが含まれていない、あなたはこのコンストラクタoverloadの使用を検討してcreateConstraints = falseを渡し、例外を防ぐことができますされ、いくつかの子レコードがないようにすることに注意してくださいかもしれません親レコードを見つける。

DataRelation dr = new DataRelation("provcomp", 
    ds.Tables["dtbl2"].Columns["id"], 
    ds.Tables["dtbl"].Columns["id_prov_comp"], 
    false); 
+0

これは部分的に機能しました...このコードは "検索私はそれが両方のテーブルを検索し、フォームの魔法使いを記入する必要がある場合は、2つのテーブルからのコントロールが含まれています。私はそれが私のエラーを与えることはありませんが、子テーブル上にある何かを入力すると、同じエラーが再び取得します。 –

+0

これはまったく別の問題です。この関係には、親テーブルに、子テーブルのすべてのFKが含まれている必要があります。あなたは関係を全く必要としないかもしれません。いずれにせよ、それはあなたの現在の質問の範囲を超えています。私はその答えがカバーしていると思います。 –

0

問題はあなたのデータです。各テーブルにプライマリキーを追加し、それを外部キーとリンクしようとしています。

ただし、受信したエラーメッセージから、存在しないdtbl2のIDにdtblをリンクしようとしているようです。

問題レコードがどこにあるかを調べ、「親」を追加するか、親を変更するか、レコードを削除するかを選択するSQLクエリを実行しようとします。

SELECT * FROM componentes WHERE id_prov_comp NOT IN (SELECT ID FROM proveedores) 
+0

SQLクエリで空のdtbl結果が得られます... –

0

親カラム(プライマリキー)は、子カラム(外部キー)の前に来る必要があります。これを試してみてください:

DataRelation dr = new DataRelation("provcomp", 
      ds.Tables["dtbl2"].Columns["id"], 
      ds.Tables["dtbl"].Columns["id_prov_comp"]); 
関連する問題