Итак, я работаю над базой данных, которую буду добавлять в свои будущие проекты в качестве вспомогательной базы данных, но у меня возникли некоторые проблемы с ней, особенно с журналами.
База данных должна обновляться один раз в месяц. Основная таблица должна быть очищена, а затем снова заполнена из файла CSV. Проблема в том, что Sql Server сгенерирует для него журнал, который будет большим по размеру. Мне удалось один раз заполнить его, но я хотел проверить весь процесс, очистив его, а затем снова заполнив его.
Вот когда я получаю сообщение об ошибке, файл журнала заполняется. Он переходит с 88 МБ (после сокращения по плану обслуживания) до 248 МБ, а затем полностью останавливает процесс и никогда не завершается.
Я ограничил его рост 256 МБ, увеличившись на 16 МБ, поэтому он потерпел неудачу, но на самом деле он мне вообще не нужен, чтобы что-то регистрировать. Есть ли способ просто полностью обойти протоколирование любого запроса, выполняемого к базе данных?
Спасибо за любые ответы заранее!
РЕДАКТИРОВАТЬ: В соответствии с предложениями @ mattmc3 я реализовал SqlBulkCopy для всей процедуры. Это работает УДИВИТЕЛЬНО, за исключением того, что мой цикл как-то падает на самом последнем оставшемся фрагменте, который нужно вставить. Я не очень уверен, где я иду не так, черт возьми, я даже не знаю, является ли это правильный цикл, поэтому я был бы признателен за помощь в этом.
Я знаю, что это проблема с последними вызовами GetDataTable или SetSqlBulkCopy. Я пытаюсь вставить 788189 строк, 788000 получить, а остальные 189 сбой ...
string[] Rows;
using (StreamReader Reader = new StreamReader("C:/?.csv")) {
Rows = Reader.ReadToEnd().TrimEnd().Split(new char[1] {
'\n'
}, StringSplitOptions.RemoveEmptyEntries);
};
int RowsInserted = 0;
using (SqlConnection Connection = new SqlConnection("")) {
Connection.Open();
DataTable Table = null;
while ((RowsInserted < Rows.Length) && ((Rows.Length - RowsInserted) >= 1000)) {
Table = GetDataTable(Rows.Skip(RowsInserted).Take(1000).ToArray());
SetSqlBulkCopy(Table, Connection);
RowsInserted += 1000;
};
Table = GetDataTable(Rows.Skip(RowsInserted).ToArray());
SetSqlBulkCopy(Table, Connection);
Connection.Close();
};
static DataTable GetDataTable(
string[] Rows) {
using (DataTable Table = new DataTable()) {
Table.Columns.Add(new DataColumn("A"));
Table.Columns.Add(new DataColumn("B"));
Table.Columns.Add(new DataColumn("C"));
Table.Columns.Add(new DataColumn("D"));
for (short a = 0, b = (short)Rows.Length; a < b; a++) {
string[] Columns = Rows[a].Split(new char[1] {
','
}, StringSplitOptions.RemoveEmptyEntries);
DataRow Row = Table.NewRow();
Row["A"] = Columns[0];
Row["B"] = Columns[1];
Row["C"] = Columns[2];
Row["D"] = Columns[3];
Table.Rows.Add(Row);
};
return (Table);
};
}
static void SetSqlBulkCopy(
DataTable Table,
SqlConnection Connection) {
using (SqlBulkCopy SqlBulkCopy = new SqlBulkCopy(Connection)) {
SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("A", "A"));
SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("B", "B"));
SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("C", "C"));
SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("D", "D"));
SqlBulkCopy.BatchSize = Table.Rows.Count;
SqlBulkCopy.DestinationTableName = "E";
SqlBulkCopy.WriteToServer(Table);
};
}
РЕДАКТИРОВАТЬ / ФИНАЛЬНЫЙ КОД: Итак, приложение теперь завершено и работает УДИВИТЕЛЬНО и довольно быстро! @ mattmc3, спасибо за помощь! Вот окончательный код для тех, кто может найти его полезным:
List<string> Rows = new List<string>();
using (StreamReader Reader = new StreamReader(@"?.csv")) {
string Line = string.Empty;
while (!String.IsNullOrWhiteSpace(Line = Reader.ReadLine())) {
Rows.Add(Line);
};
};
if (Rows.Count > 0) {
int RowsInserted = 0;
DataTable Table = new DataTable();
Table.Columns.Add(new DataColumn("Id"));
Table.Columns.Add(new DataColumn("A"));
while ((RowsInserted < Rows.Count) && ((Rows.Count - RowsInserted) >= 1000)) {
Table = GetDataTable(Rows.Skip(RowsInserted).Take(1000).ToList(), Table);
PerformSqlBulkCopy(Table);
RowsInserted += 1000;
Table.Clear();
};
Table = GetDataTable(Rows.Skip(RowsInserted).ToList(), Table);
PerformSqlBulkCopy(Table);
};
static DataTable GetDataTable(
List<string> Rows,
DataTable Table) {
for (short a = 0, b = (short)Rows.Count; a < b; a++) {
string[] Columns = Rows[a].Split(new char[1] {
','
}, StringSplitOptions.RemoveEmptyEntries);
DataRow Row = Table.NewRow();
Row["A"] = "";
Table.Rows.Add(Row);
};
return (Table);
}
static void PerformSqlBulkCopy(
DataTable Table) {
using (SqlBulkCopy SqlBulkCopy = new SqlBulkCopy(@"", SqlBulkCopyOptions.TableLock)) {
SqlBulkCopy.BatchSize = Table.Rows.Count;
SqlBulkCopy.DestinationTableName = "";
SqlBulkCopy.WriteToServer(Table);
};
}