0

这个问题需要一段时间才能详细解释,所以请多多包涵。首先是代码:

    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) 中。在调试器中检查 dsWarehouse.Tables["LOCATION"] 会按预期显示非公共成员列表中的 6 个项目,但在数据表可视化中没有包含任何数据。但是检查 dtLocation 显示 1371 个数据行。

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

我曾尝试应用 acceptChanges 和 Merge,但至少没有像我应用它们的方式那样工作。

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

4

1 回答 1

1

为了其他遇到此问题的人的利益,我将自己回答这个问题。

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

我本来希望在那个时候得到一个关于变量名歧义的错误。但是后来引用 dsWarehouse 却给出了关于“不同数据集中表之间的关系”的错误消息。

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

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

于 2013-11-11T21:25:46.010 回答