【发布时间】:2014-12-10 03:05:18
【问题描述】:
我使用 SqlBulkCopier 将大量条目插入到我们的日志数据库中。
程序的布局是:
它从网络(其他服务器)接收数据流,然后解析该流并构建Log 对象。 (200 - 400) 秒。然后我将每个日志添加到 Sql DataTable 对象中。
然后我增加一个计数器。一旦我有 10000 个日志,我就会执行 sqlBulkInsert。
现在我遇到的问题是,如果其中一行不适合 sql 验证,即一个字段太长等,那么我会丢失所有剩余的日志。
没有办法为我添加到其中的每个日志项在数据表上调用验证,这样我就可以跳过无效的并保持所有有效的安全。
目前我一次插入一个项目,如果失败我忽略它并继续下一个。但这显然破坏了 SqlBulk Copy 的点和性能优势。
一些代码:
private DataTable _logTable;
public void AddLog(Log log)
{
if (log.serverId != null || log.serverId > 1)
{
try
{
_logTable.Rows.Add(log.logId, log.messageId, log.serverId, log.time, log.direction, log.hasRouting,
log.selfRouting, log.deviceType, log.unitId, log.accountCode, log.clientId, log.data);
if (_logBufferCounter++ > BufferValue)
{
_logBufferCounter = 0;
using (var sbc = new SqlBulkCopy(_connectionString, SqlBulkCopyOptions.TableLock))
{
sbc.DestinationTableName = "dbo.Logs";
sbc.BulkCopyTimeout = 0;
sbc.WriteToServer(_logTable);
_logTable.Clear();
sbc.Close();
}
}
}
catch (Exception e)
{
Log.Error("Failed to write bulk insert for LOG Table", e);
_logTable.Clear();
}
}
else
{
Log.Error("Server Id is null for LOG: " + LogToString(log));
}
}
【问题讨论】:
-
为什么在创建 Log 对象时不验证字段?它在 SqlBulkCopy 中时应该是正确的。
标签: c# sql datatable sqlbulkcopy