这个问题需要一段时间才能详细解释,所以请多多包涵。首先是代码:
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 个同名的数据集?或者任何解决方案都会很棒!