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