DataTable.Load 跳到多结果 DataReader 中的下一个结果集
DataTable.Load Skips to next result set in multi-result DataReader
我有一个多结果查询,我正在尝试将每个结果绑定到单独的 DataGridView。
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
SqlCommand cmd = new SqlCommand("SELECT 1 select 2 select 3 select 4 select 5 select 6"
, con);
SqlDataReader reader = cmd.ExecuteReader();
int x = 50;
int y = 100;
do
{
DataGridView dgv1 = new DataGridView();
DataTable dt = new DataTable();
dt.Load(reader);
dgv1.DataSource = dt;
dgv1.Left = x;
dgv1.Top = y;
dgv1.Height = 60;
y = y + 70;
this.Controls.Add(dgv1);
} while (reader.NextResult());
reader.Close();
}
如果我不将数据加载到 DataTable 中并且不将其绑定到网格,我将得到 6 个结果集,但在上面的代码中,我继续;y 第一个、第三个和第五个结果集,看起来像填充在每个循环中跳过一个结果集。
问题是:
- 为什么会这样。
- 实现此目标最简单的解决方案是什么。
DataTable.Load,前进到下一个结果集,因此您不需要使用 NextResult()。
循环直到 reader 打开。
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
SqlCommand cmd = new SqlCommand("SELECT 1 select 2 select 3 select 4 select 5 select 6"
, con);
SqlDataReader reader = cmd.ExecuteReader();
int x = 50;
int y = 100;
do
{
DataGridView dgv1 = new DataGridView();
DataTable dt = new DataTable();
dt.Load(reader);
dgv1.DataSource = dt;
dgv1.Left = x;
dgv1.Top = y;
dgv1.Height = 60;
y = y + 70;
this.Controls.Add(dgv1);
} while (!reader.IsClosed); // here is the change
reader.Close();
}
使用read.IsClosed()的答案没有错,但要注意:
当所有 SELECT 中的字段数不相同(数据类型也相同)时,似乎存在问题:
例 1:
select 2,2 select 1
例 2:
select 2,2 select 'one', 'one'
(使用 .NET 4.5.2 测试)
我有一个多结果查询,我正在尝试将每个结果绑定到单独的 DataGridView。
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
SqlCommand cmd = new SqlCommand("SELECT 1 select 2 select 3 select 4 select 5 select 6"
, con);
SqlDataReader reader = cmd.ExecuteReader();
int x = 50;
int y = 100;
do
{
DataGridView dgv1 = new DataGridView();
DataTable dt = new DataTable();
dt.Load(reader);
dgv1.DataSource = dt;
dgv1.Left = x;
dgv1.Top = y;
dgv1.Height = 60;
y = y + 70;
this.Controls.Add(dgv1);
} while (reader.NextResult());
reader.Close();
}
如果我不将数据加载到 DataTable 中并且不将其绑定到网格,我将得到 6 个结果集,但在上面的代码中,我继续;y 第一个、第三个和第五个结果集,看起来像填充在每个循环中跳过一个结果集。
问题是:
- 为什么会这样。
- 实现此目标最简单的解决方案是什么。
DataTable.Load,前进到下一个结果集,因此您不需要使用 NextResult()。
循环直到 reader 打开。
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
SqlCommand cmd = new SqlCommand("SELECT 1 select 2 select 3 select 4 select 5 select 6"
, con);
SqlDataReader reader = cmd.ExecuteReader();
int x = 50;
int y = 100;
do
{
DataGridView dgv1 = new DataGridView();
DataTable dt = new DataTable();
dt.Load(reader);
dgv1.DataSource = dt;
dgv1.Left = x;
dgv1.Top = y;
dgv1.Height = 60;
y = y + 70;
this.Controls.Add(dgv1);
} while (!reader.IsClosed); // here is the change
reader.Close();
}
使用read.IsClosed()的答案没有错,但要注意:
当所有 SELECT 中的字段数不相同(数据类型也相同)时,似乎存在问题:
例 1:
select 2,2 select 1
例 2:
select 2,2 select 'one', 'one'
(使用 .NET 4.5.2 测试)