public static IList <string> ToCsv([NotNull] this IDataReader dataReader, bool includeHeaderAsFirstRow, char separator = ControlChars.Comma) { dataReader = dataReader.ArgumentNotNull(); var convertedRows = new List <string>(); if (includeHeaderAsFirstRow) { var sb = new StringBuilder(); for (var fieldIndex = 0; fieldIndex <= dataReader.FieldCount - 1; fieldIndex++) { if (dataReader.GetName(fieldIndex) is not null) { _ = sb.Append(dataReader.GetName(fieldIndex)); } if (fieldIndex < dataReader.FieldCount - 1) { _ = sb.Append(separator); } } convertedRows.Add(sb.ToString()); } while (dataReader.Read()) { var sb = new StringBuilder(); for (var fieldIndex = 0; fieldIndex <= dataReader.FieldCount - 2; fieldIndex++) { if (!dataReader.IsDBNull(fieldIndex)) { var value = dataReader.GetValue(fieldIndex).ToString(); if (dataReader.GetFieldType(fieldIndex) == typeof(string)) { // If double quotes are used in value, ensure each are replaced but 2. if (value.Contains(ControlChars.Backslash, StringComparison.Ordinal)) { value = value.Replace("\"", "\"\"", StringComparison.Ordinal); } // If separator are is in value, ensure it is put in double quotes. if (value.Contains(separator, StringComparison.CurrentCulture)) { value = $"{Convert.ToString(ControlChars.Backslash, CultureInfo.InvariantCulture)}{value}{ControlChars.Backslash}"; } } _ = sb.Append(value); } if (fieldIndex < dataReader.FieldCount - 1) { _ = sb.Append(separator); } } if (!dataReader.IsDBNull(dataReader.FieldCount - 1)) { _ = sb.Append(dataReader.GetValue(dataReader.FieldCount - 1).ToString().Replace(separator, ControlChars.Space)); } convertedRows.Add(sb.ToString()); } return(convertedRows); }