【问题标题】:Validating data in my Data Table before attempting to write to the database with SQLBulkCopy在尝试使用 SQLBulkCopy 写入数据库之前验证我的数据表中的数据
【发布时间】: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


【解决方案1】:

不,没有。

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

【讨论】:

  • 我听到你在说什么,你能详细说明一下 DataTable 是“HEAVY”吗?使用数据表是不好的做法吗?是的,我同意我可以在插入之前在代码中实现验证,但是我喜欢将验证规则保存在一个地方。但是由于此应用程序的性能需求,我认为您建议在代码中简单地验证它是可行的方法。
  • 另外,只是事后的想法。如何在不查询数据库的情况下验证代码中的外键约束、重复 PK 错误等内容。
猜你喜欢
  • 2015-08-15
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2011-03-19
相关资源
最近更新 更多