DataSet错误InvalidConstraintException或不能在不同DataSet中的表之间建立关系

时间:2013-10-04 23:57:13

标签: c# database dataset entity-relationship

这个问题需要一段时间才能详细解释,请耐心等待。首先是代码:

    public DataModule(Main main)
    {
        frmMain = main;

        InitializeComponent();

        getWarehouseData();

        createSortTables();
    }


    /// <summary>method : getWarehouseData
    /// Loads data from database to local objects
    /// </summary>
    private void getWarehouseData()
    {
        WarehouseDataSet dsWarehouse = new WarehouseDataSet();

        WarehouseDataSetTableAdapters.LocationTableAdapter taLocation =
            new WarehouseDataSetTableAdapters.LocationTableAdapter();

        WarehouseDataSetTableAdapters.PickOrderTableAdapter taPickOrder =
            new WarehouseDataSetTableAdapters.PickOrderTableAdapter();

        WarehouseDataSetTableAdapters.ProductTableAdapter taProduct =
            new WarehouseDataSetTableAdapters.ProductTableAdapter();

        WarehouseDataSetTableAdapters.Prod_LocTableAdapter taProd_Loc =
        new WarehouseDataSetTableAdapters.Prod_LocTableAdapter();

        taLocation.Fill(dsWarehouse.LOCATION);
        taPickOrder.Fill(dsWarehouse.PICK_ORDER);
        taProduct.Fill(dsWarehouse.PRODUCT);
        taProd_Loc.Fill(dsWarehouse.PROD_LOC);

        dtLocation = dsWarehouse.Tables["LOCATION"];
        dtPickOrder = dsWarehouse.Tables["PICK_ORDER"];
        dtProduct = dsWarehouse.Tables["PRODUCT"];
        dtProd_Loc = dsWarehouse.Tables["PROD_LOC"];
    }

    private void createSortTables()
    {
        // Modified Location Table from View
        dvSortedLocations = new DataView(dtLocation);
        dvSortedLocations.Sort = "PickTime ASC";


        // Modified Product Table as view
        DataView dvSortedProducts = new DataView(dtProduct);
        dvSortedProducts.Sort = "NumOfPicks DESC";
        dtSortedProduct = dvSortedProducts.ToTable();


        // New table for optimised Product Locations
        dtOptProd_Loc = new DataTable("OPTPROD_LOC");
        dtOptProd_Loc.Columns.Add("ProductCode", typeof(string));
        dtOptProd_Loc.Columns.Add("Location", typeof(string));
        dtOptProd_Loc.Columns.Add("StockQtty", typeof(double));

        dsWarehouse.Tables.Add(dtOptProd_Loc);  
        DataColumn parentColumn = dsWarehouse.Tables["PRODUCT"].Columns["ProductCode"];
        DataColumn childColumn = dsWarehouse.Tables["OPTPROD_LOC"].Columns["ProductCode"]; 
        DataRelation REL_Prod_OptProdLoc = new DataRelation("PRODUCTOPTPROD_LOC", parentColumn, childColumn); 
        dsWarehouse.Relations.Add(REL_Prod_OptProdLoc); 

        // New table for Picking from optimised Locations
        dsWarehouse.Tables.Add(new DataTable("OPTPICK"));
        dtOptPick = dsWarehouse.Tables["OPTPICK"];

        dtOptPick.Columns.Add("PickID", typeof(int));
        dtOptPick.Columns.Add("ProductCode", typeof(string));
        dtOptPick.Columns.Add("Location", typeof(string));
        dtOptPick.Columns.Add("PickQtty", typeof(double));
        dtOptPick.Columns.Add("SaleNumber", typeof(double));

        DataColumn parentColumn2 = dsWarehouse.Tables["LOCATION"].Columns["LocationCode"];
        DataColumn childColumn2 = dsWarehouse.Tables["OPTPICK"].Columns["Location"];
        DataRelation REL_Loc_OptPick = new DataRelation("REL_Loc_OptPick", parentColumn2, childColumn2);
        dsWarehouse.Relations.Add(REL_Loc_OptPick);


        parentColumn = dsWarehouse.Tables["PRODUCT"].Columns["ProductCode"];
        childColumn = dtOptPick.Columns["ProductCode"];
        DataRelation REL_Prod_OptPick = new DataRelation("REL_Prod_OptPick", parentColumn, childColumn);
        dsWarehouse.Relations.Add(REL_Prod_OptPick);

        foreach (DataRow dr in dtPickOrder.Rows)
        {
            dtOptPick.Rows.Add(dr.ItemArray);
        }

为Access数据库应用程序编写WindowsForms GUI。它获取数据,将其重新组织成一些新表并分析结果。作为dsWarehouse数据集加载的初始数据如getWarehouseData()所示,有4个表。

在createSortTables()中,向dsWarehouse添加了2个新表,并添加了与现有表的关系。但是,当到达底部的foreach循环以填充新的dtOptPick表时,如果显示代码,则抛出InvalidConstraintException,表示在父表(dtLocation)中不存在第一个“Location”。检查调试器中的dsWarehouse.Tables [“LOCATION”]按预期显示非公共成员列表中的6个项目,但查看数据表可视化中没有包含任何数据。但是,检查dtLocation显示1371个数据行。

所以我尝试用dtLocation替换dsWarehouse.Tables [“LOCATION”],但这会在新的DataRelation行抛出InvalidConstraintException,说“不能在不同的DataSet中的表之间建立关系”。 因此,尽管在所有情况下都使用了dsWarehouse引用,但似乎有两个不同的实际数据集,原始数据集包含所有数据,而当我尝试添加没有数据的表时,它是一个新数据集。

我尝试过应用acceptChanges和Merge但至少没有按照我应用的方式工作。

任何人都知道为什么似乎有两个同名的数据集?或者任何解决方案都很棒!!

1 个答案:

答案 0 :(得分:1)

我会自己回答这个问题,为了解决这个问题的其他人的利益。

发生的事情是我曾尝试通过MSDN演练来设置数据库连接和表适配器(TA)。但是我发现这些说明更像是通过一个复杂的迷宫找到自己的方式。事实证明,我已经从工具箱中拖了一个数据集并称之为dsWarehouse 然后以及所有TA的方式在上面以编程方式声明相同的内容。

我原本希望在这一点上得到一个关于变量名称含糊不清的错误。但是后来引用dsWarehouse后面给出了关于“不同数据集中的表之间的关系”的上述错误消息。

部分演练说明指出所有这些声明都是必需的。如果您不从工具箱中拖动,则为true。我有,所以删除所有这些声明 开始解决这个问题。修改/添加表的大部分代码也被简化了,因为变量名现在确实引用了与预期相同的对象。

另一个相关提示,请确保在要写入数据的任何表中都设置了主键。我忽略了在我的新表上执行此操作并不断收到数据无法添加的错误,因为它不符合外键 限制。我花时间确认实际上数据中没有约束问题,但缺少主键导致问题。