所以,我正在研究一个数据库,我将把它作为一个支持数据库添加到我未来的项目中,但我遇到了一些问题,特别是日志.
数据库基本上每月需要更新一次.必须清除主表,然后重新填充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,感谢所有的帮助!以下是可能发现有用的人的最终代码:
ListRows = new List (); 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 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); }; }
mattmc3.. 5
如果你正在做一个大容量插入到SQL Server中,表这是你应如何做这个(BCP
,Bulk Insert
,Insert Into...Select
,或在.NET中,SqlBulkCopy
类),你可以使用恢复模型的"批量登录".我强烈建议您阅读有关恢复模型的MSDN文章:http://msdn.microsoft.com/en-us/library/ms189275.aspx
如果你正在做一个大容量插入到SQL Server中,表这是你应如何做这个(BCP
,Bulk Insert
,Insert Into...Select
,或在.NET中,SqlBulkCopy
类),你可以使用恢复模型的"批量登录".我强烈建议您阅读有关恢复模型的MSDN文章:http://msdn.microsoft.com/en-us/library/ms189275.aspx