在尝试使用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));
        }
    }

在尝试使用SQLBulkCopy写入数据库之前,正在验证数据表中的数据

不,没有。

但是,作为程序员,您可以在插入之前进行验证。你知道,没那么难。而且根本不需要有一个HEAVY数据表——使用普通对象,并使用所需接口的自己实现将它们锤击到SqlBulkDCopy实例中;)