我有一个返回 14 个表的存储过程。现在,在我的应用程序中,数据集包含所有 DataTable 名称为 table、table1、table2、table3 ... 的数据表。我在这里想要的是,我的数据集应该包含与数据库表名称相同的所有数据表。可能吗 ?
提前感谢。
您可以使用TableMappings
for yourDataAdapter
来获取正确的表名:
using (var con = new SqlConnection(connectionString))
{
string sql = @"SELECT * FROM locGSP;
SELECT * FROM locCountry;
SELECT * FROM locMarketUnit";
using(var da = new SqlDataAdapter(sql, con))
{
// demonstrate the issue here:
DataSet dsWrong = new DataSet();
da.Fill(dsWrong); // now all tables are in this format: Table,Table1,Table2
// following will map the correct names to the tables
DataSet dsCorrect = new DataSet();
da.TableMappings.Add("Table", "locGSP");
da.TableMappings.Add("Table1", "locCountry");
da.TableMappings.Add("Table2", "locMarketUnit");
da.Fill(dsCorrect); // now we have the correct table-names: locGSP,locCountry,locMarketUnit
}
}
这是使用DataReader
andDataSet.Load
填充的另一种方式DataSet
:
using (var con = new SqlConnection(connectionString))
{
string sql = @"SELECT * FROM locGSP;
SELECT * FROM locCountry;
SELECT * FROM locMarketUnit";
using (var cmd = new SqlCommand(sql, con))
{
con.Open();
using (var rdr = cmd.ExecuteReader())
{
// after the next line the DataSet will have the correct table-names
ds.Load(rdr, LoadOption.OverwriteChanges, "locGSP", "locCountry", "locMarketUnit");
}
}
}
背景:
多个结果集:如果 DataAdapter 遇到多个结果集,它会在 DataSet 中创建多个表。这些表被赋予一个递增的默认名称TableN,从 Table0 的“Table”开始。如果将表名作为参数传递给 Fill 方法,则会为表指定一个递增的默认名称 TableNameN,从 TableName0 的“TableName”开始。
在这里,您有一个要点可以帮助您进行此映射。
用法:
SomeDataSet dt = DataUtil.Fill<SomeDataSet>(
procedureName: "someSP",
connectionString: "yourConnectionString",
values: new {
someValue = 15,
otherValue = "test",
},
mappings: new {
Table1: "YourDataSetTable1",
Table2: "YourDataSetTable2",
}
);
(最后的代码仅适用于框架 4.0)
您的过程返回 14 个结果集,而不是表。除非您特别命名它们,否则它们是未命名的结果集。例如,以下查询的表名是什么?
select c.Name,sum(o.orders) as NumOrder,sum(o.price) as TotalPrice
from
customer c
join orders o on o.cust_id=c.cust_id
group by c.name
有效的 SQL 查询,但 SQL 不知道如何称呼这个“虚拟表”或结果集。