从 DataSet 中的 DataTables 输出数据

Posted

技术标签:

【中文标题】从 DataSet 中的 DataTables 输出数据【英文标题】:Output data from DataTables within DataSet 【发布时间】:2020-01-03 05:02:13 【问题描述】:

我目前使用多个查询访问数据库并将查询结果存储到 DatatTables 中。我决定是因为我使用多个 DataTables 将它们存储在 DataSet 中。

当我打印出来时,我可以看到数据在 DataTables 中。但是,当我尝试从 DataSet 访问它们以打印出数据时,我什么也得不到;它是空的。

string querytest1  = "SELECT * FROM test1";
string querytest2  = "SELECT * FROM test2";
string querytest3  = "SELECT * FROM test3";

using(OleDbConnection connection = new OleDbConnection(connectionString))

     OleDbCommand commandtest1 = new OleDbCommand(querytest1 , connection);
     OleDbCommand commandtest2 = new OleDbCommand(querytest2 , connection);
     OleDbCommand commandtest3  = new OleDbCommand(querytest3 , connection);

     connection.Open();

     DataSet dataSet = new DataSet();

     OleDbDataAdapter dataAdaptertest1  = new OleDbDataAdapter(commandResults);
     OleDbDataAdapter dataAdaptertest2 = new OleDbDataAdapter(commandResults);
     OleDbDataAdapter dataAdaptertest3  = new OleDbDataAdapter(commandProjects);

      DataTable dataTabletest1  = new DataTable();
      DataTable dataTabletest2 = new DataTable();
      DataTable dataTabletest3  = new DataTable();

       dataAdaptertest1.Fill(dataTabletest1 );
       dataAdaptertest2.Fill(dataTabletest2 );
       dataAdaptertest3.Fill(dataTabletest3 );

       dataTabletest1  = dataSet.Tables.Add("test1 ");
       dataTabletest2  = dataSet.Tables.Add("test2 ");
       dataTabletest3  = dataSet.Tables.Add("test3 ");

        Console.WriteLine("DataSet has 0 DataTables \n", dataSet.Tables.Count);

        foreach (DataTable objDt in dataSet.Tables)
                Console.WriteLine("0", objDt.TableName);

        return dataSet;

预期行为:能够从 DataSet 访问 DataTable 并打印出数据。

示例:打印出Test1中的内容

代码是多余的。我只是不知道更好的方法来做到这一点。

【问题讨论】:

为什么需要一个数据集?您可以只创建一个表名数组["test1","test2","test3"],然后打开连接并使用循环来获取结果,如OledbAdapter oa = new OledbAdapter(command)Datatable tb = new Datatable(); oa.Fill(tb); print(tb) 编写一个打印函数,循环遍历列并将其显示给用户。 【参考方案1】:

您不需要三个适配器来用三个命令的结果填充 DataSet。

你可以简单地写:

string query1 = "SELECT * FROM test1";
string query2 = "SELECT * FROM test2";
string query3 = "SELECT * FROM test3";
DataSet dataSet = new DataSet();

using(OleDbConnection connection = new OleDbConnection(connectionString))

     connection.Open();

     OleDbCommand cmd = new OleDbCommand(q1, connection);
     OleDbDataAdapter da  = new OleDbDataAdapter(cmd);
     da.Fill(ds, "Test1");
     cmd.CommandText = q2;
     da  = new OleDbDataAdapter(cmd);
     da.Fill(ds, "Test2");
     cmd.CommandText = q3;
     da  = new OleDbDataAdapter(cmd);
     da.Fill(ds, "Test3");

Console.WriteLine("DataSet has 0 DataTables \n", ds.Tables.Count);
    foreach (DataTable objDt in ds.Tables)
            Console.WriteLine("0", objDt.TableName);

诀窍是三次填充同一个 DataSet 而不是三个不同的 DataTables,并在每次填充时为创建的每个表指定不同的名称。

【讨论】:

【参考方案2】:

但是,您没有看到 dataSet.Tables.Add() 调用实际上创建了新的 DataTable 实例,并试图将其 TableName 属性设置为“test1”(顺便说一句。小心,空间不允许在 TableName 中使用)。

新创建的实例被设置为属性dataTabletest1...3 - 因此,您无法访问最初使用数据库中的数据填充的原始实例。

你应该这样做:

  DataTable dataTabletest1 = dataSet.Tables.Add("Test1");
  DataTable dataTabletest2 = dataSet.Tables.Add("Test2");
  DataTable dataTabletest3 = dataSet.Tables.Add("Test3");

  dataAdaptertest1.Fill(dataTabletest1);
  dataAdaptertest2.Fill(dataTabletest2);
  dataAdaptertest3.Fill(dataTabletest3);

请检查:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable-dataview/adding-a-datatable-to-a-dataset

【讨论】:

以上是关于从 DataSet 中的 DataTables 输出数据的主要内容,如果未能解决你的问题,请参考以下文章

怎么样子可以改变 jqeury datatables 的高度和宽度

datatables 自定义数据源

如何从 DataTables 中的选定数据中获取数据

C#中DataSet类的使用

从数据源中为 DataTables 中的第 1 行请求未知参数“0”

如何让下拉选择从 Django 模型中填充模板中的 DataTables 表?