/// <summary> /// Load results returned from stored procedure. /// </summary> public static void LoadResults(this IDbCommandBinding binding, IDbDataAccess db, DbDataReader reader, object instance) { var recordsetCount = binding.RecordsetCount; if (recordsetCount == 0) { reader.Read(); binding.GetOutputFields(db, reader, instance); } else { for (var index = 0; index < recordsetCount; index++) { if (index > 0 && !reader.NextResult()) { throw new ArgumentException($"Unable to load recordset index {index}"); } var rsBinding = binding.Recordsets?.FirstOrDefault(b => b.Attributes.Index == index); if (rsBinding != null) { rsBinding.LoadResults(db, reader, instance); } else { var rBinding = binding.Records?.FirstOrDefault(b => b.Attributes.Index == index); if (rBinding != null) { rBinding.LoadResults(db, reader, instance); } } } } }
/// <summary> /// Get output fields. /// </summary> public static void GetOutputFields(this IDbCommandBinding binding, IDbDataAccess db, DbDataReader reader, object instance) { DbHelper.SetDbRef(instance, db); if (reader.HasRows) { binding.Fields?.ForEach(b => b.GetOutputField(reader, instance)); } }
protected abstract void LoadResults <T>(IDbCommandBinding binding, DbDataReader reader, T template);
/// <summary> /// Assigns all output parameters on the template instance. /// </summary> public static void GetOutputParameters(this IDbCommandBinding binding, DbCommand cmd, object instance) { binding.Parameters?.ForEach(b => b.GetOutputParameters(cmd, instance)); }
/// <summary> /// Assigns all input parameters on the command. /// </summary> public static string SetInputParameters(this IDbCommandBinding binding, string query, object instance) { binding.Parameters?.ForEach(b => b.SetInputParameters(ref query, instance)); return(query); }