Эффективный способ загрузки огромных данных в datatable
Привет, я загружаю файл DBF в существующую таблицу sql в консольном приложении c#. Во-первых ,мой dbf-файл,содержащий 8,50,000+ записей, я должен был загрузить весь DBF-файл в datatable, это привело к исключению нехватки памяти при обработке 400000+ записей. Поэтому я читаю запись за раз и добавляю в datatable в виде строки. Он прекрасно работал до 6,00 000 + записей. После этой записи я столкнулся с системой.OutofMemoryException. Пожалуйста, кто-нибудь помогите мне загрузить файл DBF в таблицу sql в консольном приложении c#. Мой код здесь, я пробовал много оптимизаций кода, но безрезультатно
public void ConvertDBFtoSQL() { string connStr = @"Provider=VFPOLEDB.1;Data Source=dbf file path;Persist Security Info=False; User ID=Admin;Password=;"; using (OleDbConnection oleDbConnection = new OleDbConnection(connStr)) { oleDbConnection.Open(); string query = "select * from dbftable"; OleDbCommand oleDbCommand = new OleDbCommand(query, oleDbConnection); oleDbCommand.CommandTimeout = 600000; OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(); int fieldCount = oleDbDataReader.FieldCount; DataTable dataTable= CreateDataTable(); string[] rows = new string[fieldCount]; while (oleDbDataReader.Read()) { using (dataTable) { Array.Clear(rows, 0, rows.Length); for (int i = 0; i < fieldCount; i++) { try { rows[i] = oleDbDataReader.GetFieldType(i).Name.ToLower() == "datetime"? "\"" + Convert.ToDateTime(oleDbDataReader.GetValue(i)).ToString("dd/MM/yyyy").Substring(0, 10) + "\"": (oleDbDataReader.GetValue(i).ToString().Contains(",") ? "" :"\"" + oleDbDataReader.GetValue(i).ToString().Trim() + "\""); } catch (Exception ex) { } } string row = string.Join(",", rows); dataTable.Rows.Add(new object[] { row }); } } } }
Что я уже пробовал:
Сначала я попробовал dataTable.Load (oledbcommand.executereader()) это сбой с исключением из памяти, тогда я попробовал прочитать строку и добавить в datatable.
Michael_Davies
Зачем вы их все загружаете? Никто не может прочесть их все или увидеть их все!
Tomas Takac
Данные просто слишком велики, вы не можете загрузить их все в память. Зачем вам это нужно в первую очередь?
sankarisiva
Потому что мне нужно загрузить все эти данные в таблицу sql. Если у i datatable есть целые данные, то я могу использовать опцию bulkinsert для загрузки в таблицу sql
Tomas Takac
Нет, вам не нужно загружать все это в память. SqlBulkCopy может использовать считыватель данных.[^]