所以,我正在开发一个数据库,我将把它作为一个支持数据库添加到我未来的项目中,但我遇到了一些问题,尤其是日志。
数据库基本上需要每月更新一次。必须清除主表,然后重新填充CSV文件。问题是Sql Server会为它生成一个MEGA大的日志。我成功填写了一次,但想通过清洗然后重新填充它来测试整个过程。
当我收到日志文件已填满的错误时。它从88MB(通过维护计划收缩后)跳到248MB,然后完全停止并永远不会完成。
我将其增长限制在256MB,增加了16MB,这就是它失败的原因,但实际上我根本不需要它来记录任何东西。有没有办法完全绕过对数据库运行的任何查询的登录?
感谢您提前做出任何回复!
编辑:根据@ 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);
};
}
答案 0 :(得分:5)
如果您正在对SQL Server中的表进行批量插入,那么您应该如何执行此操作(BCP
,Bulk Insert
,Insert Into...Select
或在.NET中执行此操作SqlBulkCopy
类)您可以使用“批量记录”恢复模型。我强烈建议您阅读有关恢复模型的MSDN文章:http://msdn.microsoft.com/en-us/library/ms189275.aspx
答案 1 :(得分:2)
答案 2 :(得分:1)
无法绕过SQL Server中的事务日志。