C # SQLServer извлекает результаты и размещает их в формате .csv

Я посмотрел на сайте и в Google, но, похоже, я не смог найти хорошее решение для того, что я пытаюсь сделать.

`

К сожалению, я действительно плохо знаком с подключением C # к SQL. Мне нужны советы о том, как просто поместить результаты в строку в формате CSV. Столбцы и поля, вероятно, будут разными, поэтому я не могу использовать метод чего-то [что-то], как я видел на нескольких сайтах. Я не уверен, что я понятен!

Буду очень признателен за любые советы / советы о том, как это сделать, пожалуйста!

9
задан Tom H 9 July 2010 в 18:51
поделиться

5 ответов

Вот метод, который я использую для выгрузки любого IDataReader в StreamWriter. Обычно я создаю StreamSwriter следующим образом: new StreamWriter (Response.OutputStream) . Я конвертирую любые двойные кавычки во входных данных в одинарные кавычки (возможно, это не лучший способ справиться с этим, но он работает для меня).

public static void createCsvFile(IDataReader reader, StreamWriter writer) {
    string Delimiter = "\"";
    string Separator = ",";

    // write header row
    for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
        if (columnCounter > 0) {
            writer.Write(Separator);
        }
        writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter);
    }
    writer.WriteLine(string.Empty);

    // data loop
    while (reader.Read()) {
        // column loop
        for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
            if (columnCounter > 0) {
                writer.Write(Separator);
            }
            writer.Write(Delimiter + reader.GetValue(columnCounter).ToString().Replace('"', '\'') + Delimiter);
        }   // end of column loop
        writer.WriteLine(string.Empty);
    }   // data loop

    writer.Flush();
}
16
ответ дан 4 December 2019 в 10:32
поделиться

Вы можете адаптировать реализацию модуля записи CSV , доступную здесь .

Если вам также необходимо проанализировать файлы CSV, реализация здесь относительно хорош.

Формат CSV сложнее, чем кажется, особенно если вы собираетесь иметь дело с произвольными данными, возвращаемыми из запроса. Вам нужно будет уметь обрабатывать экранирование специальных символов (например, кавычек и запятых), иметь дело с разрывами строки и т.п. Лучше найти и использовать проверенную реализацию, особенно если вы новичок в C #.

1
ответ дан 4 December 2019 в 10:32
поделиться

Вы можете получить имена столбцов таблицы следующим образом:

SqlConnection conn = new SqlConnection(connString);
conn.Open();

SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rdr = cmd.ExecuteReader();

DataTable schema = rdr.GetSchemaTable();
foreach (DataRow row in schema.Rows) 
{
    foreach (DataColumn col in schema.Columns)
        Console.WriteLine(col.ColumnName + " = " + row[col]);
}

rdr.Close()
conn.Close();

Конечно, вы можете определить имена столбцов только по первой строке, здесь это делается для каждой строки.

Вы можете теперь поместите свой собственный код, чтобы довольно легко объединить столбцы в строку CSV ...

Спасибо

1
ответ дан 4 December 2019 в 10:32
поделиться

Как уже упоминалось, существует довольно много проблем с разделителями, правильным экранированием символов и правильным форматированием различных типов. Но если вы просто ищете пример помещения данных в строку, вот еще один. Он не выполняет никаких проверок вышеупомянутых осложнений.

  public static void ReaderToString( IDataReader Reader )
     {
     while ( Reader.Read() )
        {
        StringBuilder str = new StringBuilder();
        for ( int i = 0; i < Reader.FieldCount; i++ )
           {

           if ( Reader.IsDBNull( i ) )
              str.Append( "null" );
           else
              str.Append( Reader.GetValue( i ).ToString() );

           if ( i < Reader.FieldCount - 1 )
              str.Append( ", " );

           }
        // do something with the string here
        Console.WriteLine(str);
        }
     }
1
ответ дан 4 December 2019 в 10:32
поделиться

При работе с CSV-файлом я обычно обращаюсь к библиотеке FileHelpers: она имеет класс SqlServerStorage, который можно использовать для чтения записей с SQL-сервера и записи их в CSV-файл.

1
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: