Я посмотрел на сайте и в Google, но, похоже, я не смог найти хорошее решение для того, что я пытаюсь сделать.
`
К сожалению, я действительно плохо знаком с подключением C # к SQL. Мне нужны советы о том, как просто поместить результаты в строку в формате CSV. Столбцы и поля, вероятно, будут разными, поэтому я не могу использовать метод чего-то [что-то], как я видел на нескольких сайтах. Я не уверен, что я понятен!
Буду очень признателен за любые советы / советы о том, как это сделать, пожалуйста!
Вот метод, который я использую для выгрузки любого 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();
}
Вы можете адаптировать реализацию модуля записи CSV , доступную здесь .
Если вам также необходимо проанализировать файлы CSV, реализация здесь относительно хорош.
Формат CSV сложнее, чем кажется, особенно если вы собираетесь иметь дело с произвольными данными, возвращаемыми из запроса. Вам нужно будет уметь обрабатывать экранирование специальных символов (например, кавычек и запятых), иметь дело с разрывами строки и т.п. Лучше найти и использовать проверенную реализацию, особенно если вы новичок в C #.
Вы можете получить имена столбцов таблицы следующим образом:
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 ...
Спасибо
Как уже упоминалось, существует довольно много проблем с разделителями, правильным экранированием символов и правильным форматированием различных типов. Но если вы просто ищете пример помещения данных в строку, вот еще один. Он не выполняет никаких проверок вышеупомянутых осложнений.
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);
}
}
При работе с CSV-файлом я обычно обращаюсь к библиотеке FileHelpers: она имеет класс SqlServerStorage, который можно использовать для чтения записей с SQL-сервера и записи их в CSV-файл.