DbDataReader,NextResult()并填充多个表

这个问题是我以前的问题的延续。 没有太多细节,我正在用2个相关的1对多表填充数据集。 所以,我现在的问题是 – 为什么这段代码运作良好

public DataAgencyR_DataSet SelectOne(int id) { DataAgencyR_DataSet result = new DataAgencyR_DataSet(); using (DbCommand command = Connection.CreateCommand()) { try { command.CommandText = SqlStrings.SelectDataAgencyR_SelectOne(); var param = ParametersBuilder.CreateByKey(command, "ID_DeclAgenc", id, "ID_DeclAgenc"); command.Parameters.Add(param); Connection.Open(); using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { System.Diagnostics.Trace.WriteLine(String.Format("{0}-{1}", reader[0], reader[1])); } System.Diagnostics.Trace.WriteLine("-------------"); reader.NextResult(); while (reader.Read()) { System.Diagnostics.Trace.WriteLine(String.Format("{0}-{1}", reader[0], reader[1])); } } } catch (DbException e) { Logger.Error(e.Message, e); throw new DataAccessException("Error occurs while SelectOne method porcessed", e); } finally { if (Connection.State != ConnectionState.Closed) Connection.Close(); } } return result; } public static string SelectDataAgencyR_SelectOne() { return "SELECT a.* FROM t0_DataAgency_R a WHERE a.SetToPartners = 1 AND a.ID_DeclAgenc = @ID_DeclAgenc;" + "SELECT c.* FROM t01_ChoiceParam_R c JOIN t0_DataAgency_R a on a.ID_DeclAgenc = c.ID_DeclAgenc WHERE SetToPartners = 1 AND a.ID_DeclAgenc = @ID_DeclAgenc"; } 

而事实并非如此

 public DataAgencyR_DataSet SelectOne(int id) { DataAgencyR_DataSet result = new DataAgencyR_DataSet(); using (DbCommand command = Connection.CreateCommand()) { try { command.CommandText = SqlStrings.SelectDataAgencyR_SelectOne(); var param = ParametersBuilder.CreateByKey(command, "ID_DeclAgenc", id, "ID_DeclAgenc"); command.Parameters.Add(param); Connection.Open(); using (DbDataReader reader = command.ExecuteReader()) { result.t0_DataAgency_R.Load(reader); reader.NextResult(); result.t01_ChoiceParam_R.Load(reader); } } catch (DbException e) { Logger.Error(e.Message, e); throw new DataAccessException("Error occurs while SelectOne method porcessed", e); } finally { if (Connection.State != ConnectionState.Closed) Connection.Close(); } } return result; } public static string SelectDataAgencyR_SelectOne() { return "SELECT a.* FROM t0_DataAgency_R a WHERE a.SetToPartners = 1 AND a.ID_DeclAgenc = @ID_DeclAgenc;" + "SELECT c.* FROM t01_ChoiceParam_R c JOIN t0_DataAgency_R a on a.ID_DeclAgenc = c.ID_DeclAgenc WHERE SetToPartners = 1 AND a.ID_DeclAgenc = @ID_DeclAgenc"; } 

在第二个例子之后,我只填充了result.t0_DataAgency_R表 – 但不是result.t01_ChoiceParam_R。 为什么会这样?

提前致谢

DataTable.Load自动将阅读器推进到下一个结果。 因此,您应该删除对NextResult的显式调用。

含义:

 using (DbDataReader reader = command.ExecuteReader()) { result.t0_DataAgency_R.Load(reader); result.t01_ChoiceParam_R.Load(reader); } 

将DataSet添加到混合…我们曾经使用过SqlDataAdapter并返回了一个DataSet但没有利用任何离线function等,所以SqlDataReader更适合。 这是填充DataSet的代码。 发现这总体上快了大约10%。

  Dim s As DataSet = New DataSet() Using reader As SqlDataReader = command.ExecuteReader() Dim tables As New List(Of DataTable) Do Dim table As New DataTable() table.Load(reader) tables.Add(table) s.Tables.Add(table) Loop While Not reader.IsClosed s.Load(reader, LoadOption.OverwriteChanges, tables.ToArray()) End Using