2011-01-20 110 views
0

我被困在当下,下面的问题。我会尽我所能尽力解释它,但请告诉我是否需要更多解释。我已经在Google电子表格中添加了一些内容以帮助解释,请参阅下面的链接。将数据集插入DataTable

https://spreadsheets.google.com/ccc?key=0An70K3Q_IiWAdGpfV2YzNFQ4aTYxTWIxSUd5azVMWEE&hl=en&authkey=CMO898QP

电子表格:
MainTable = C#的应用数据表
数据= SQL从SQL查询(数据集)结果

的数据的电子表格需要被翻译/转换成指定的格式MainTable电子表格。

每个rowid都在那里,因为它们涉及到一些独特的东西。举个例子。如果我们假设rowid 1用于“本月的总销售额”,则可以在数据电子表格中看到单元格C2需要转到MainTable电子表格中的单元格E2。

如果我们假设rowid 2是用于“货架上货架”,您可以在数据电子表格中看到单元格D3需要转到MainTable电子表格中的单元格F3。

...等等。我首先用下面的代码接近它,但这不起作用,因为prodcode在我的数据集中不是唯一的。我会创建另一个数据集或列表,但是我不确定该从哪里去。我看错了吗?

foreach (DataRow dsrow in dsproduct.Tables["loadUniqueProducts"].Rows) 
     { 
      string prodcode = Convert.ToString(dsrow["prodcode"]); 

      for (int i = 1; i <= 14; i++) 
      { 
       row = table.NewRow(); 
       row["rowid"] = i; 
       row["prodcode"] = prodcode; 
       table.Rows.Add(row); 
      } 
     } 

感谢您的帮助。

回答

0

相当令人困惑的问题; DataSets,DataTables和电子表格都是不同的东西。 loadUniqueProducts您的电子表格中的Data表格?这是一个DataTable,而不是一个DataSet。

电子表格是有序的,有空行,并且比DataTable更类似于C#数组;数据表不应该有空行。

rowid对于DataColumn来说是一个非常糟糕的名字,它通常用于引用数据库中的顺序行ID。 prodcode不在任何地方描述,是您的“PRODUCT”数据之后的数字?

为什么要添加14个空行?您只应将具有数据的行添加到DataTable。然后你再次为loadUniqueProducts中的每一行执行此操作。大量重复数据。

我假设你想要做的是逐行浏览loadUniqueProducts中的每一行,并找到MainTable中的匹配行。如果该行尚不存在,请创建它。然后找出“uniqueProducts”具有哪些MainTable列的值,并将其复制。这听起来是对的吗?

下面是一些示例代码,用于销售总额(RowID = 1)。我没有这样做对股票的货架上,或任何其他列,但是这应该给你的想法:

foreach (DataRow r in dsproduct.Tables["loadUniqueProducts"].Rows) 
{ 
    int productID = r.Field<System.Int32>("ProductID"); 
    string productExpression = "ProductID=" + productID.ToString(); 
    string salesExpression = productExpression + " AND RowID=1"; 

    int? monthSales = r.Field<System.Int32?>("MonthSales"); 
    if ((monthSales.HasValue) && (monthSales.Value > 0)) 
    { 
     DataTable destTable= dsproduct.Tables["MainTable"]; 
     DataRow[] selectedRows = destTable.Select(salesExpression); 
     DataRow destRow; 
     if (selectedRows.Length > 1) 
      throw new Exception(String.Format("MainTable has ProductID {0} duplicate Sales RowID 1.", productID)); 
     else if (selectedRows.Length == 1) 
      destRow = selectedRows[0]; 
     else 
     { 
      destRow = destTable.NewRow(); 
      destRow.SetField<System.Int32>("RowID", 1); 
      destRow.SetField<System.Int32>("ProductID", productID); 
      destTable.Rows.Add(destRow); 
     } 

     string locColumn = "Loc" + r.Field<System.Char>("Loc"); 
     destRow.SetField<System.Int32>(locColumn, monthSales.Value); 
    } 

这应该是固定的,以避免在运行时创建的列名,并创建强命名的DataTable会得到摆脱<System.Int32>的东西,但这应该让你开始。