我正在阅读Excel工作表并应用我的业务逻辑,我正在尝试使用Linq to SQL
插入。
在我的循环中,我有> (greater than) 5,000 records
和< (Less than) 15,000 records
来插入。
public List<tblLog> tblLogList = new List<tblLog>();
此方法位于循环内部:
public void SaveLog()
{
tblLog tnlog = new tblLog();
tnlog.id = Guid.NewGuid();
tnlog.comp_id = Comp_id;
tnlog.branch_id = Branch_id;
tnlog.row_id = rowID;
tnlog.his_id = his_id;
//Add records to List
tblLogList.Add(tnlog);
之前我已经尝试过这段代码逐一提交:
//_trContext.tblLogs.InsertOnSubmit(tblLog);
//_trContext.SubmitChanges();
由于效果受到影响,我已将InsertOnSubmit
更改为InsertAllOnSubmit
if (tblLogList.Count >= 1000)
{
_trContext.tblLogs.InsertAllOnSubmit(tblLogList);
_trContext.SubmitChanges();
tblLogList.Clear();
}
}
我的问题是:
我可以通过InserAllOnSubmit()在Linq到Sql中插入的最大数量记录是什么。
通过我上面的代码,我获得了多达1000条记录,但我发誓,虽然代码在我的Timeout Exception
中实现后可能会通过一些**windows service**
获得10,000或更多记录。
我真的很困惑,处理上述逻辑的最佳建议是什么。?
先谢谢。
答案 0 :(得分:5)
虽然其他人正确地指出有更好的解决方案来完成这项任务,但还没有直接回答你的问题。
答案是技术上该数字受上下文吞噬所有这些新对象所占用的内存量或数据库事务日志的最大大小的限制。前者更有可能成为瓶颈,但是您可以通过以数百或数千块的形式提交记录来防止达到这两个限制,并且使用新的上下文(!)为每个批次。
正如你所说,实用限制可能是命令超时(如果你不想让它永恒)。这也可以通过批量提交来规避,从而为每个批次启动一个新命令。
功能限制取决于流程是否无人值守(耐心)以及数据是否预期在一定时间内可用。如果这些要求很严格,您可能不得不采用其他答案中建议的解决方案之一。
答案 1 :(得分:3)
在该卷上,我将使用SqlBulkCopy,可能通过DataTable,或者通过FastMember的ObjectReader API,它从类型对象列表中创建一个IDataReader,适合提供给SqlBulkCopy。
答案 2 :(得分:2)
你正在使用错误的工具来完成工作。 LINQ-to-SQL和大多数其他ORM适用于OLTP。你在这里没有做OLTP,你正在进行“批量”插入ETL。使用正确的工具,例如SqlBulkCopy
或dedicated framework。