使用 IDataReader 从 SqlBulkCopy 返回记录

Posted

技术标签:

【中文标题】使用 IDataReader 从 SqlBulkCopy 返回记录【英文标题】:Return Records From SqlBulkCopy using IDataReader 【发布时间】:2012-12-08 03:08:43 【问题描述】:

我正在使用 SqlBulkCopy 类对我的数据库进行批量插入/更新。数据插入/更新后,我想用它做更多的逻辑。

目前,我的 IDataReader 混合了要插入和更新的记录。针对数据库的所有操作都正常工作。但是,数据写入后,IDataReader 对象不再有任何行。

有没有办法保留行,并为插入的记录自动生成唯一标识符字段?

这是我的代码中的一个 sn-p:

    public IDataReader DoBulkCopy<T>(List<T> DataToInsert, string DestinationTableName)
    
        var BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString, SqlBulkCopyOptions.KeepNulls);
        BulkCopy.BulkCopyTimeout = 0;
        BulkCopy.BatchSize = 50;
        BulkCopy.DestinationTableName = DestinationTableName;

        IDataReader reader = DataToInsert.AsDataReader();
        BulkCopy.WriteToServer(reader);
        BulkCopy.Close();

        return reader;
    

提前致谢。

【问题讨论】:

【参考方案1】:

经过大量研究,我得出结论,这是不可能的。我能够想出一个解决方法。我所做的是在执行查询之前将 DateTime.Now() 写入变量。执行查询后,我对 LastUpdated 时间戳字段大于插入/更新之前记录的 DateTime 变量的所有记录进行了选择查询。

请注意,这在我的场景中运行良好,因为此表中的数据仅由此调度程序插入/更新。如果这是一个数据可以来自多个地方或用户的应用程序,则需要重新考虑或调整这种方法。

【讨论】:

以上是关于使用 IDataReader 从 SqlBulkCopy 返回记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有多个表的 IDataReader 中检索值

引发了“System.OutOfMemoryException”类型的异常。 C# 使用 IDataReader 时

C#中IDataReader和DataSet的区别是啥呢?

当我尝试返回元组时,IDataReader 已关闭

在 C# 中使用 IDataReader 读取 dbf 文件

C# - IDataReader 到使用泛型的对象映射