DataReader to .CSV with column names

前端 未结 5 979
清酒与你
清酒与你 2020-12-15 10:49

I\'m generating a csv file from an SqlDataReader, however it is not writing the column names, how can I make it write them? The code I\'m using is as follows:



        
5条回答
  •  借酒劲吻你
    2020-12-15 11:16

    You can use SqlDataReader.GetName to get the column name

    for (int i = 0; i < reader.FieldCount; i++)
    {
        string columnName = reader.GetName(i);
    }
    

    Also you can create an extension method like below:

    public static List ToCSV(this IDataReader dataReader, bool includeHeaderAsFirstRow, string separator)
    {
        List csvRows = new List();
        StringBuilder sb = null;
    
        if (includeHeaderAsFirstRow)
        {
            sb = new StringBuilder();
            for (int index = 0; index < dataReader.FieldCount; index++)
            {
                if (dataReader.GetName(index) != null)
                    sb.Append(dataReader.GetName(index));
    
                if (index < dataReader.FieldCount - 1)
                    sb.Append(separator);
            }
            csvRows.Add(sb.ToString());
        }
    
        while (dataReader.Read())
        {
            sb = new StringBuilder();
            for (int index = 0; index < dataReader.FieldCount - 1; index++)
            {
                if (!dataReader.IsDBNull(index))
                {
                    string value = dataReader.GetValue(index).ToString();
                    if (dataReader.GetFieldType(index) == typeof(String))
                    {
                        //If double quotes are used in value, ensure each are replaced but 2.
                        if (value.IndexOf("\"") >= 0)
                            value = value.Replace("\"", "\"\"");
    
                        //If separtor are is in value, ensure it is put in double quotes.
                        if (value.IndexOf(separator) >= 0)
                            value = "\"" + value + "\"";
                    }
                    sb.Append(value);
                }
    
                if (index < dataReader.FieldCount - 1)
                    sb.Append(separator);
            }
    
            if (!dataReader.IsDBNull(dataReader.FieldCount - 1))
                sb.Append(dataReader.GetValue(dataReader.FieldCount - 1).ToString().Replace(separator, " "));
    
            csvRows.Add(sb.ToString());
        }
        dataReader.Close();
        sb = null;
        return csvRows;
    }
    

    Example:

    List rows = null;
    using (SqlDataReader dataReader = command.ExecuteReader())
        {
            rows = dataReader.ToCSV(includeHeadersAsFirstRow, separator);
            dataReader.Close();
        }
    

提交回复
热议问题