【问题标题】:Inserting Dataset into DataTable将数据集插入数据表
【发布时间】:2011-06-12 03:38:18
【问题描述】:

我目前遇到以下问题。我会尽力解释它,但如果您需要更多说明,请告诉我。我在谷歌电子表格中放了一些东西来帮助解释,链接如下。

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);
            }
        }

感谢您的帮助。

【问题讨论】:

    标签: c# sql datatable dataset


    【解决方案1】:

    一个相当令人困惑的问题;数据集、数据表和电子表格都是不同的东西。 loadUniqueProducts 是电子表格中的 Data 表吗?那是 DataTable,而不是 DataSet。

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

    rowid 是一个非常糟糕的 DataColumn 名称,它通常用于引用数据库中的顺序行 ID。 prodcode 没有在任何地方描述,是您的“产品”数据后面的数字吗?

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

    我假设您要做的是逐步遍历 loadUniqueProducts 中的每一行并在 MainTable 中找到匹配的行。如果此行尚不存在,请创建它。然后找出“uniqueProducts”具有哪个 MainTable 列的值,并复制它们。听起来对吗?

    这里是一些示例代码,用于执行 Total Sales (RowID = 1)。我还没有为 Stock on Shelves 或任何其他专栏这样做,但这应该会给你一个想法:

    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);
        }
    

    应该解决此问题以避免在运行时创建列名,并且创建强名称 DataTables 会摆脱 &lt;System.Int32&gt; 的东西,但这应该可以帮助您开始。

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2011-10-18
      • 2012-11-24
      • 2012-11-11
      相关资源
      最近更新 更多