C # SQLServer извлекает результаты и размещает их в формате .csv - PullRequest
9 голосов
/ 26 декабря 2009

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

По сути, у меня есть клиент-серверное приложение (C #), в которое я отправляю серверу оператор SQL select (Connecting to SQL Server 2008) и хотел бы вернуть результаты в виде CSV обратно клиенту.

Пока у меня есть следующее:

if (sqlDataReader.HasRows)
{
    while(sqlDataReader.Read())
    {
       //not really sure what to put here and if the while should be there!
    }

} `

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

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

Ответы [ 5 ]

15 голосов
/ 26 декабря 2009

Вот метод, который я использую для выгрузки любого 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();
}
1 голос
/ 27 декабря 2009

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

1 голос
/ 26 декабря 2009

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

  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 голос
/ 26 декабря 2009

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

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 голос
/ 26 декабря 2009

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

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

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

...