14 個のテーブルを返すストアド プロシージャがあります。さて、私のアプリケーションでは、テーブル、テーブル1、テーブル2、テーブル3などのDataTable名を持つすべてのデータテーブルを含むデータセットです。ここで欲しいのは、私のデータセットには、データベーステーブル名と同じ名前を持つすべてのデータテーブルが必要です。出来ますか ?
よろしくお願いします。
TableMappings
forを使用してDataAdapter
、正しいテーブル名を取得できます。
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
と を使用してDataSet.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 に複数のテーブルが作成されます。テーブルには、Table0の "Table" で始まる、TableNのインクリメンタルなデフォルト名が与えられます。テーブル名が引数として Fill メソッドに渡される場合、テーブルには、TableName0 の "TableName" で始まる、TableNameN のインクリメンタルな既定の名前が与えられます。
ここに、このマッピングに役立つ要点があります。
使用法:
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 はこの「仮想テーブル」または結果セットを何と呼ぶべきかわかりません。