internal static List <DataReaderRow> GetDataReaderRows(this IDataReader dataReader, Dictionary <Type, int> columnsWithSkipCount) { var dataReaderRows = new List <DataReaderRow>(); var columnNames = new List <string>(); for (var i = 0; i < dataReader.FieldCount; i++) { var fieldName = dataReader.GetName(i).ReplaceFirst("_", "."); columnNames.Add(fieldName); } while (columnsWithSkipCount.Any(x => x.Value == -1)) { var item = columnsWithSkipCount.First(x => x.Value == -1); columnsWithSkipCount[item.Key] = columnNames.FindIndex(x => x.StartsWith(item.Key.Name + ".")); } while (dataReader.Read()) { var row = new DataReaderRow(); for (var i = 0; i < columnNames.Count; i++) { var c = columnNames[i]; row[c] = dataReader[i] ?? DBNull.Value; } dataReaderRows.Add(row); } return(dataReaderRows); }
internal static List <DataReaderRow> GetDataReaderRows(this IDataReader dataReader, string[] columnNames, string typeName, DotEntityDbCommand command) { Throw.IfArgumentNullOrEmpty(typeName, nameof(typeName)); var dataReaderRows = new List <DataReaderRow>(); var ordinalsCaptured = ProcessedQueryCache.TryGet(command.Query, out Dictionary <string, int> columnOrdinals); while (dataReader.Read()) { if (!ordinalsCaptured) { ordinalsCaptured = true; columnOrdinals = columnOrdinals ?? new Dictionary <string, int>(); //the microsoft sqlite reader's get ordinal performs case sensitive comparision, we'll have to lower case the columns in the case var doLower = typeName == "SqliteMaster" && dataReader.GetType().FullName == "Microsoft.Data.Sqlite.SqliteDataReader"; foreach (var c in columnNames) { columnOrdinals.Add(typeName + "." + c, dataReader.GetOrdinal(doLower ? c.ToLowerInvariant() : c)); } ProcessedQueryCache.TrySet(command.Query, columnOrdinals); } var row = new DataReaderRow(); foreach (var c in columnOrdinals) { row[c.Key] = dataReader[c.Value]; } dataReaderRows.Add(row); } return(dataReaderRows); }
internal static List <List <DataReaderRow> > GetRawDataReaderRows(this IDataReader dataReader) { var dataReaderRows = new List <List <DataReaderRow> >(); var hasResultSet = true; var resultIndex = 0; while (hasResultSet) { var newList = new List <DataReaderRow>(); string[] columnNames = null; try { columnNames = GetColumnNames(dataReader); } catch { //we'll have to manually do something----------------------------------------- } //| while (dataReader.Read()) //| { //| var fieldCount = dataReader.FieldCount; //| var row = new DataReaderRow(); //| if (columnNames == null) //<-------------------------------------------------- { columnNames = new string[fieldCount]; for (var i = 0; i < fieldCount; i++) { columnNames[i] = dataReader.GetName(i); } } foreach (var c in columnNames) { row[c] = dataReader[c]; } newList.Add(row); } dataReaderRows.Add(newList); hasResultSet = dataReader.NextResult(); } return(dataReaderRows); }