从 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 的高度和宽度