这个问题需要一段时间才能详细解释,请耐心等待。首先是代码:
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但至少没有按照我应用的方式工作。
任何人都知道为什么似乎有两个同名的数据集?或者任何解决方案都很棒!!
答案 0 :(得分:1)
我会自己回答这个问题,为了解决这个问题的其他人的利益。
发生的事情是我曾尝试通过MSDN演练来设置数据库连接和表适配器(TA)。但是我发现这些说明更像是通过一个复杂的迷宫找到自己的方式。事实证明,我已经从工具箱中拖了一个数据集并称之为dsWarehouse 然后以及所有TA的方式在上面以编程方式声明相同的内容。
我原本希望在这一点上得到一个关于变量名称含糊不清的错误。但是后来引用dsWarehouse后面给出了关于“不同数据集中的表之间的关系”的上述错误消息。
部分演练说明指出所有这些声明都是必需的。如果您不从工具箱中拖动,则为true。我有,所以删除所有这些声明 开始解决这个问题。修改/添加表的大部分代码也被简化了,因为变量名现在确实引用了与预期相同的对象。
另一个相关提示,请确保在要写入数据的任何表中都设置了主键。我忽略了在我的新表上执行此操作并不断收到数据无法添加的错误,因为它不符合外键 限制。我花时间确认实际上数据中没有约束问题,但缺少主键导致问题。