эффективный способ вставить данные из Access в CSV-файл - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь вставить данные из базы данных доступа в файл .csv в C#. У меня 54744 записей в базе данных Access. Вставка записей в файл CSV занимает более 2 часов. Ниже мой код:

 public void CreateCSVFile()
        {
            DataSet dsRecLoad = new DataSet();
            DataTable dt = new DataTable("RecsCDDt");
            StringBuilder sb = new StringBuilder();
            using (OleDbConnection connection = new OleDbConnection(_configuration.GetConnectionString("AccessConnection")))
            {
                using (OleDbCommand cmd = new OleDbCommand("select * from RecsCD", connection))
                {
                    connection.Open();
                    OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.Default);
                    dt.Load(reader);

                }
            }

                foreach (DataRow row in dt.Rows)
                {
                   foreach (DataColumn dc in dt.Columns)
                    {
                        if (!String.IsNullOrEmpty(sb.ToString()))
                            sb.Append(",");
                       sb.Append(row[dc.ColumnName].ToString());

                   }

                    sb.Append("\n");
                }

                string CSVfilePath = _configuration.GetValue<string>("MySettings:CSVFile");
                if (!File.Exists(CSVfilePath))
                {

                    File.WriteAllText(CSVfilePath, sb.ToString()) ;
                }


        }

Может кто-нибудь предложить мне более эффективный способ вставить записи в файл .CSV.

Спасибо.

1 Ответ

3 голосов
/ 09 апреля 2020

Вот небольшой пример того, как вы могли бы достичь того же результата путем потоковой передачи данных с использованием устройства чтения и записи в файл в виде потока (не проверено):

await using var textWriter = new StreamWriter("path\\to\\file.csv");
await using var writer = new CsvHelper.CsvWriter(textWriter, CultureInfo.InvariantCulture);

await using var connection = new SqlConnection("connection_string");
await using var cmd = new SqlCommand("select * from RecsCD", connection);
await connection.OpenAsync();
await using var reader = await cmd.ExecuteReaderAsync();

while (await reader.ReadAsync()) {
    foreach (int i in Enumerable.Range(0, reader.FieldCount)) {
        writer.WriteField(await reader.GetFieldValueAsync<object>(i));
    }

    await writer.NextRecordAsync();
}
await writer.FlushAsync();

Обратите внимание, что код зависит от CsvHelper библиотека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...