在尝试使用SQLBulkCopy写入数据库之前,正在验证数据表中的数据
本文关键字:验证 数据表 数据 数据库 SQLBulkCopy | 更新日期: 2023-09-27 18:26:36
我使用SqlBulkCopier将大量条目插入日志数据库。
程序的布局是:
它从网络(其他服务器)接收数据流,然后解析该流并构建Log
对象。(200-400)秒。然后,我将每个日志添加到SqlDataTable对象中。
然后我递增一个计数器。一旦我有了10000个日志,我就会执行sqlBulkInsert。
现在我遇到的问题是,如果其中一行不符合sql验证,即,一个字段太长等,那么我会丢失所有剩余的日志。
对于我添加到其中的每个日志项,是否没有一种方法可以在数据表上调用validate,这样我就可以跳过无效的日志项,并确保所有有效的日志项的安全。
目前,我一次插入一个项目,如果失败,我会忽略它并继续下一个项目。但这显然违背了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));
}
}
不,没有。
但是,作为程序员,您可以在插入之前进行验证。你知道,没那么难。而且根本不需要有一个HEAVY数据表——使用普通对象,并使用所需接口的自己实现将它们锤击到SqlBulkDCopy实例中;)