1対多の関係を持つ2つのテーブルを含むDataSetを埋めようとしています。私はこれを達成するためにDataReaderを使用しています:
public DataSet SelectOne(int id)
{
DataSet result = new DataSet();
using (DbCommand command = Connection.CreateCommand())
{
command.CommandText = "select * from table1";
var param = ParametersBuilder.CreateByKey(command, "ID", id, null);
command.Parameters.Add(param);
Connection.Open();
using (DbDataReader reader = command.ExecuteReader())
{
result.MainTable.Load(reader);
}
Connection.Close();
}
return result;
}
しかし、私は1つのテーブルだけを埋めました。どうすれば目標を達成できますか-両方のテーブルに記入しますか?
可能であれば、DataAdapterの代わりにDataReaderを使用したいと思います。
複数のselectステートメントを含む単一のコマンドを発行する場合、NextResultメソッドを使用して、データリーダー内の次の結果セットに移動できます。 http://msdn.Microsoft.com/en-us/library/system.data。 idatareader.nextresult.aspx
私はそれがどのように見えるかを示します:
public DataSet SelectOne(int id)
{
DataSet result = new DataSet();
using (DbCommand command = Connection.CreateCommand())
{
command.CommandText = @"
select * from table1
select * from table2
";
var param = ParametersBuilder.CreateByKey(command, "ID", id, null);
command.Parameters.Add(param);
Connection.Open();
using (DbDataReader reader = command.ExecuteReader())
{
result.MainTable.Load(reader);
reader.NextResult();
result.SecondTable.Load(reader);
// ...
}
Connection.Close();
}
return result;
}
DataSetを複数のテーブルで埋めるには、データベースに複数の要求を送信するか、より高速な方法で行います。複数のSELECTステートメントを1つの要求でデータベースサーバーに送信できます。ここでの問題は、クエリから生成されたテーブルの名前が自動的にTableおよびTable1になることです。ただし、生成されたテーブル名は、DataSetで使用される名前にマップできます。
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT * FROM Customers; SELECT * FROM Orders", connection);
adapter.TableMappings.Add("Table", "Customer");
adapter.TableMappings.Add("Table1", "Order");
adapter.Fill(ds);
これは古いトピックですが、一部の人にとっては役に立つかもしれません:
DataSet someDataSet = new DataSet();
SqlDataAdapter adapt = new SqlDataAdapter();
using(SqlConnection connection = new SqlConnection(ConnString))
{
connection.Open();
SqlCommand comm1 = new SqlCommand("SELECT * FROM whateverTable", connection);
SqlCommand comm2g = new SqlCommand("SELECT * FROM whateverTable WHERE condition = @0", connection);
commProcessing.Parameters.AddWithValue("@0", "value");
someDataSet.Tables.Add("Table1");
someDataSet.Tables.Add("Table2");
adapt.SelectCommand = comm1;
adapt.Fill(someDataSet.Tables["Table1"]);
adapt.SelectCommand = comm2;
adapt.Fill(someDataSet.Tables["Table2"]);
}
上記のMSDNページに記載されている例を参照してください。
Load
のメソッドDataTable
はNextResult
でDataReader
を実行するため、NextResult
を使用する場合は明示的にLoad
を呼び出さないでください。シーケンスは省略されます。
DataReader
を使用して複数のテーブルをロードする一般的なソリューションを次に示します。
// your command initialization code here
// ...
DataSet ds = new DataSet();
DataTable t;
using (DbDataReader reader = command.ExecuteReader())
{
while (!reader.IsClosed)
{
t = new DataTable();
t.Load(rs);
ds.Tables.Add(t);
}
}
public DataSet GetDataSet()
{
try
{
DataSet dsReturn = new DataSet();
using (SqlConnection myConnection = new SqlConnection(Core.con))
{
string query = "select * from table1; select* from table2";
SqlCommand cmd = new SqlCommand(query, myConnection);
myConnection.Open();
SqlDataReader reader = cmd.ExecuteReader();
dsReturn.Load(reader, LoadOption.PreserveChanges, new string[] { "tableOne", "tableTwo" });
return dsReturn;
}
}
catch (Exception)
{
throw;
}
}
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("data source=.;uid=sa;pwd=123;database=shop");
//SqlCommand cmd = new SqlCommand("select * from tblemployees", con);
//SqlCommand cmd1 = new SqlCommand("select * from tblproducts", con);
//SqlDataAdapter da = new SqlDataAdapter();
//DataSet ds = new DataSet();
//ds.Tables.Add("emp");
//ds.Tables.Add("products");
//da.SelectCommand = cmd;
//da.Fill(ds.Tables["emp"]);
//da.SelectCommand = cmd1;
//da.Fill(ds.Tables["products"]);
SqlDataAdapter da = new SqlDataAdapter("select * from tblemployees", con);
DataSet ds = new DataSet();
da.Fill(ds, "em");
da = new SqlDataAdapter("select * from tblproducts", con);
da.Fill(ds, "prod");
GridView1.DataSource = ds.Tables["em"];
GridView1.DataBind();
GridView2.DataSource = ds.Tables["prod"];
GridView2.DataBind();
}
string connetionString = null;
SqlConnection connection ;
SqlCommand command ;
SqlDataAdapter adapter = new SqlDataAdapter();
DataSet ds = new DataSet();
int i = 0;
string firstSql = null;
string secondSql = null;
connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password";
firstSql = "Your First SQL Statement Here";
secondSql = "Your Second SQL Statement Here";
connection = new SqlConnection(connetionString);
try
{
connection.Open();
command = new SqlCommand(firstSql, connection);
adapter.SelectCommand = command;
adapter.Fill(ds, "First Table");
adapter.SelectCommand.CommandText = secondSql;
adapter.Fill(ds, "Second Table");
adapter.Dispose();
command.Dispose();
connection.Close();
//retrieve first table data
for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
MessageBox.Show(ds.Tables[0].Rows[i].ItemArray[0] + " -- " + ds.Tables[0].Rows[i].ItemArray[1]);
}
//retrieve second table data
for (i = 0; i <= ds.Tables[1].Rows.Count - 1; i++)
{
MessageBox.Show(ds.Tables[1].Rows[i].ItemArray[0] + " -- " + ds.Tables[1].Rows[i].ItemArray[1]);
}
}
catch (Exception ex)
{
MessageBox.Show("Can not open connection ! ");
}