【问题标题】:c# split one datatable to several into datasetc# 将一个数据表拆分为多个数据集
【发布时间】:2017-05-13 12:52:40
【问题描述】:

我有正确的源数据表“sourceDataTable”,我调用方法将它分成几个并将结果存储到DataSet“ds”中:

 DataSet ds = MyClass.SplitDataTables(sourceDataTable);

这里是 MyClass.SplitDataTables() 方法:

public static DataSet SplitDataTables(DataTable sourceDataTable)
    {
        using (DataSet dsOut = new DataSet())
        {
            DataTable dt1 = new DataTable;
            DataTable dt2 = new DataTable;
            DataTable dt3 = new DataTable;

            dt1 = sourceDataTable.Clone();
            dt2 = sourceDataTable.Clone();
            dt3 = sourceDataTable.Clone();

            foreach (DataRow row in sourceDataTable.Rows)
            {
                //column is for example "City" and some row has "Boston" in it, so I put this row into dt1
                if (row["ColumnName"].ToString() == "something")
                {
                    dt1.ImportRow(row);
                }
                else if (...)
                {  } //for other DataTables dt2, dt3, etc...

                else .......... ;
            }


            //here I put resulting DataTables into one DataSet which is returned
            string[] cols= { "dt1", "dt2", "dt3" };

            foreach (string col in cols)
            {
                dsOut.Tables.Add(col);
            }

            return dsOut;

        }
    }

因此,使用这个返回的 DataSet,我会显示新的 Windows,每个窗口都有一个 DataTable

foreach (DataTable dtt in ds.Tables)
                    {
                        string msg = dtt.TableName;
                        Window2 win2 = new Window2(dtt, msg);
                        win2.Show();
                    }

我看到的只是带有“空 DataGrid”占位符的 Windows Windows 代码是正确的,因为它适用于“unsplit DataTable”。

我假设拆分 DataTables 的代码都是错误的,因为它不会输出带有填充 DataTables 的 DataSet。我将不胜感激在这个问题上的任何帮助。谢谢!

【问题讨论】:

    标签: c# datatable split dataset


    【解决方案1】:

    这里不需要for循环

    替换下面的代码

    string[] cols= { "dt1", "dt2", "dt3" };
    
    foreach (string col in cols)
       {
         dsOut.Tables.Add(col);
       }
    

    有了这个

    dsOut.Tables.Add(dt1);
    dsOut.Tables.Add(dt2);
    dsOut.Tables.Add(dt3);
    

    【讨论】:

    • 先生,有趣的是:您的更改显示了异常/错误,即带有“SomeObjectName”的 DataTable(此名称是 sourceDataTable 的名称)已经是此 DataSet 的一部分!用我的 foreach 这个循环编译得很好,没有任何错误!
    • 这是否意味着,该问题在“dt1 = sourceDataTable.Clone();”中哪些克隆也是对象属性?但没有它我不能使用“dt1.ImportRow(row);”
    • 在我之前发布的代码之前,我这样做是为了将 sourceDataTable 保存到 XML 文件: public static void SaveXML(DataTable sourceDataTable) { //必须设置一些名称否则无法写入 XML 文件 sourceDataTable.TableName = "某些对象名称"; sourceDataTable.WriteXml("report.xml"); }
    • 问题是您只是添加了带有名称的空表,而不是实际的表。您可以为数据表设置名称
    【解决方案2】:

    感谢@Krishna,我解决了这个问题。因此,如果您遇到类似的问题,请注意以下两点:

    string[] cols = { "dt1", "dt2", "dt3", ... };
    
                foreach (string col in cols)
                {
                    dsOut.Tables.Add(col);
                }
    

    这个循环不能访问同名的DataTables对象,只将空的DataTables写入DataSet集合(不管同名!)。

    如果您创建新的 DataTable 并将其复制为另一个 DataTable,请不要设置它的名称。

    DataTable dt1 = new DataTable();
    

    制作与源数据表格式相同的新数据表:

    dt1 = sourceDataTable.Clone();
    dt2 = sourceDataTable.Clone();
    //etc...
    

    现在您必须为从源 DataTable 克隆的每个 DataTable 设置唯一的 DataTable 名称:

    dt1.TableName = "Name1";
    dt2.TableName = "Name2";
    //and so on
    

    现在一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      相关资源
      最近更新 更多