while recuperar pasar mediante dbdatareader datos convert c# sql ado.net dataset datareader

c# - recuperar - DbDataReader, NextResult() y llenando más de una tabla



recuperar datos mediante datareader c# (2)

Esta pregunta es la continuación de mi anterior . Sin entrar en demasiados detalles, estoy llenando el conjunto de datos con 2 tablas relacionadas de 1 a muchos. Entonces, mi pregunta ahora es: ¿por qué este código funciona bien?

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"; }

y esto no es

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"; }

Después del segundo ejemplo, he rellenado solo la tabla result.t0_DataAgency_R, pero no result.t01_ChoiceParam_R. ¿Por qué puede ser así?

Gracias por adelantado


DataTable.Load avanza automáticamente el lector al próximo resultado. Por lo tanto, debe eliminar su llamada explícita a NextResult .

Sentido:

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


Agregar un DataSet a la mezcla ... solíamos usar SqlDataAdapter y devolvimos un DataSet pero no aprovechamos ninguna de las características fuera de línea, etc., por lo que un SqlDataReader encaja mejor. Aquí hay un código para llenar un DataSet. Encontré que esto era aproximadamente un 10% más rápido en general.

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