2015-01-20 4 views
0

Каков наилучший подход к хранению информации, собранной локально в CSV-файлах с C# .net sql-database? Мои причины для запроса: 1: Данные, которые я обрабатываю, массивны (миллионы строк в каждом csv). 2: Данные чрезвычайно точные, поскольку они описывают измерения в наноскопической шкале и поэтому являются деликатными.Csv-файлы в Sql-базу данных C#

Моим первым было сохранение каждой строки csv в соответствующей строке в базе данных. Я сделал это с помощью класса DataTable.cs. Когда все закончится, я чувствую, что если что-то пойдет не так, когда разбор. CSV-файла, я бы никогда не заметил.

Моим вторым является загрузка .csvfiles в базу данных в формате .csv и последующий анализ файла из базы данных на локальную среду, когда пользователь запрашивает ее. Если это возможно в C# .net с визуальным stuido 2013, как это можно сделать эффективным и безопасным образом?

+1

Почему что-то не так, если вы разбираете файл? Вы должны разработать функцию синтаксического анализа, чтобы убедиться, что она исправляет проверку и выполняет регистрацию ошибок, чтобы вы не пропустили никаких проблем. – musefan

+0

Да, и у меня есть. Я проверяю всевозможные ошибки, которые приходят на ум, но как насчет ошибок, которые этого не делают? – user2858578

+1

показать нам свой код – jayvee

ответ

0

Возможно, вы должны использовать Bulk Insert. С вашим CSV-файлом в качестве источника. Но это будет работать, только если файл доступен с ПК, на котором запущен ваш SQL Server.

Here вы также можете найти хорошее решение. Одним словом это выглядит следующим образом:

StreamReader file = new StreamReader(bulk_data_filename); 
CsvReader csv = new CsvReader(file, true,','); 
SqlBulkCopy copy = new SqlBulkCopy(conn); 
copy.DestinationTableName = tablename; 
copy.WriteToServer(csv); 
1

Я использовал .Net библиотеки потоков данных от csv reader в моем проекте. Он использует класс SqlBulkCopy, хотя он не является бесплатным.

Пример:

using (CsvDataReader csvData = new CsvDataReader(path, ',', Encoding.UTF8)) 
    { 
     // will read in first record as a header row and 
     // name columns based on the values in the header row 
     csvData.Settings.HasHeaders = true; 

     csvData.Columns.Add("nvarchar"); 
     csvData.Columns.Add("float"); // etc. 

     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) 
     { 
      bulkCopy.DestinationTableName = "DestinationTable"; 
      bulkCopy.BulkCopyTimeout = 3600; 

      // Optionally, you can declare columnmappings using the bulkCopy.ColumnMappings property 

      bulkCopy.WriteToServer(csvData); 
     } 
    } 
1

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

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

Возможно, мне что-то не хватает, но я не вижу преимущества хранения CSV.

+0

^Это простое ведение журнала ошибок или даже попытка try-catch вокруг метода с MessageBox, чтобы показать исключение, должны быть пойманы, если произойдут какие-либо ошибки (например, первичные нарушение ключа). – St0ffer