C#如何创建现有表列的主键

时间:2016-08-25 13:11:42

标签: c# datatables foreign-keys primary-key relationship

我想请求你的帮助。问题是我试图关联两个表,所以我需要在每个“id”列的表上创建主键,但是我在这一行上收到错误

class MyClass {
public:
    void playMahJam() {

        if (!music.openFromFile("data/sounds/music.wav")){
            std::cout << "Error..." << std::endl;
        }
        else{
            music.setLoop(true);
            music.setVolume(50);
            music.play();
        }
    } // end playMahJam()
private:
    sf::Music jam;
};

错误:

  

无法启用此约束,因为并非所有值都具有相应的父值。

(原版错误的西班牙文= No se puede habilitarestalimitciónyque que todos los valores no tienen los valores primarios correspondenceientes。

我做错了什么?

ds.Relations.Add(dr);

提前致谢。

3 个答案:

答案 0 :(得分:0)

这里的问题是你的数据。您正在为每个表添加主键,然后尝试使用外键将它们链接。

但是,从您收到的错误消息中,听起来您试图将dtbl链接到dtbl2中不存在的id。

我会尝试执行SQL查询以找出问题记录所在的位置,然后选择添加&#34; parent&#34;,更改父级或删除记录。

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

答案 1 :(得分:0)

主键是可以的 - 您已经使用以下行成功创建了它们:

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
)

我认为你做错了是指定了错误的列 - parentColumn应指向被引用的表childColumn - 引用它的表。

简单地将其改为:

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);

答案 2 :(得分:0)

父列(即主键)必须位于子列(即外键)之前。试试这个:

    function createFromJSON(JSONText){
      console.log("In Create Function");
      dojo.disconnect(handle);

      var jsontext = JSON.parse(JSONText);
      var polygon = new esri.geometry.Polygon(jsontext);
      console.log("Here is the polygon object:");
      console.log(polygon);
      console.log("Now drawing polygon");
       map.graphics.add(new Graphic(polygon, new SimpleFillSymbol()));
      console.log("Polygon should be there");
    }