В данной статье я хочу показать как легко и быстро можно сохранять данные, находящиеся в SQL-базе в файл формата .csv, который поддерживает Microsoft Exscel.
Это достаточно часто требуется для предоставления отчетности за некоторый период, если мы говорим о финансовых и прочих учреждениях.
Для начала нам потребуется некоторая таблица базы данных SQL-Server.
К примеру, имеется таблица кредитов одного из местных отделений некоторого банка.
В данной таблице хранится информация по всем выданным данным банком кредитам:

Рис 1. Структура таблицы Credits
Определение таблицы Credits состоит из уникального ключа id, идентификатора дебитора
debitor_id, которому выдан данный кредит, размер кредита (тело) amount и
текущее значение не погашенной еще части кредита balance. Однако, если вам трудно понять
данную структуру колонок, пропустите этот шаг, - на процесс сохранения данных в csv-файл это не повлияет.
Данные кредитов могут выглядеть таким образом:

Рис 2. Данные (записи) таблицы Credits
Ну и, в числе прочего, Национальный Банк запросил отчетность у данного банка за весь период его существования.
Для быстрого формирования отчета код, извлекающий все записи из таблицы Credits и
записывающий их в файл .scv может выглядеть следующим образом:
void CopyToCSV
{
StreamWriter file;
file = new StreamWriter("Credits.csv", false);
using (connection = new SqlConnection(
ConfigurationManager.ConnectionStrings
["MyConnection"].ConnectionString))
{
try
{
query = "SELECT * FROM Credits";
SqlCommand command =
new SqlCommand(query, connection);
connection.Open();
SqlDataReader SQLreader =
command.ExecuteReader();
file.WriteLine(
@"""id"";""debitor_id"";""amount"";""balance""");
if (SQLreader.HasRows)
{
while (SQLreader.Read())
{
file.WriteLine(@"""" +
SQLreader.GetValue(0).ToString() +
@""";""" +
SQLreader.GetValue(1).ToString() +
@""";""" +
SQLreader.GetValue(2).ToString() +
@""";""" +
SQLreader.GetValue(3).ToString() +
@"""");
}
}
else
file.WriteLine(
"No one row is in \"Credits\" table");
file.WriteLine("End of file");
file.Close();
SQLreader.Close();
connection.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (connection.State == ConnectionState.Open)
connection.Close();
connection.Dispose();
}
}
По поводу блока finally, то закрытие соединения и удаление объекта из памяти
не есть обязательным поскольку мы объект-соединение поместили в блок using,
что само уже подразумевает автоматический вызов метода Dispose().
Также обращаю ваше внимание на точное соблюдение множества кавычек и точек с запятой.
Данный формат символов позволяет выполнять поячеечную и построчную разметку данных в
конечном csv-файле. Конечно, вместо простой конкатенации строковых литералов лучше
использовать класс StringBuilder, однако в данном примере я намеренно не усложнял
визуальное восприятие кода.
В итоге, мы получили файл Credits.csv. Открыв его программой Excel, мы увидим ожидаемые данные:

Рис 3. Данные (записи) таблицы Credits.csv
Конечно, вместо SQLreader.GetValue(i) мы можем использовать индексатор SQLreader[i],
или еще лучше точно задавать имя столбца ячейки SQLreader["debitor_id"].
В следующей статье я покажу обратный процесс экспорта данных из csv-файла в контрол DataSet,
из которого уже не составляет труда переместить данные в любую другую БД.
Импорт csv-данных в DataSet