And*_*rko 19 c# sql ado.net datareader dataset
我正在尝试填充包含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;
}
Run Code Online (Sandbox Code Playgroud)
但我只填了一张桌子.我如何实现目标 - 填写两个表格?
如果可能的话,我想使用DataReader而不是DataAdapter.
Moh*_*ari 28
使用多个表填充DataSet可以通过向数据库发送多个请求或以更快的方式完成:可以在单个请求中将多个SELECT语句发送到数据库服务器.这里的问题是从查询生成的表具有自动名称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);
Run Code Online (Sandbox Code Playgroud)
smo*_*per 21
如果要发出包含多个select语句的单个命令,则可以使用NextResult方法移动到datareader中的下一个结果集: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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个古老的话题,但对某些人来说可能有用:
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"]);
}
Run Code Online (Sandbox Code Playgroud)