问题标签 [sqlbulkcopy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1040 浏览

c# - WriteToServer:连接属性尚未初始化。sqlbulkcopy 错误

在 c# 中运行 sqlbulkcopy 时出现错误:WriteToServer: Connection property has not been initialized。

它发生在 WriteToServer 命令中。连接已打开。

正确代码:

0 投票
2 回答
1285 浏览

sql-server-2005 - SQL Server 2005:提高数千或插入请求的性能。注销登录时间= 120ms

有人可以阐明 SQL Server 2005 如何处理使用 ADO.NET 2.0 的客户端发出的可能请求。下面是 SQL Trace 的简短输出。我可以看到连接池正在工作(我相信只有一个连接正在池中)。我不清楚为什么我们有这么多 sp_reset_connection 调用,即一系列:审计登录、SQL:BatchStarting、RPC:Starting 和下面 for 循环中每个循环的审计注销。我可以看到 tempdb 和 master 数据库之间不断切换,这使我得出结论,当通过基于 ConectionString 参数从池中获取创建下一个连接时,我们丢失了上下文。

我可以看到每 15 毫秒我每秒可以获得 100-200 次登录/注销(由 Profiler 同时报告)。在 15 毫秒之后,我再次获得了每秒 100-200 次登录/注销的系列。

我需要澄清这可能如何影响生产环境中复杂的插入查询。我使用 Enterprise Library 2006,代码是用 VS 2005 编译的,它是一个控制台应用程序,它解析一个包含数千行分组父子行的平面文件,在应用程序服务器上运行并在远程 SQL 上运行 2 个存储过程Server 2005 插入父记录,检索标识值并使用它调用第二个存储过程 1、2 或多次(有时数千)插入子记录。子表有近 1000 万条记录,其中有 5-10 个索引,其中一些索引覆盖非集群。有一个非常复杂的插入触发器,它将插入的详细记录复制到存档表。总而言之,我每秒只有 7 次插入,这意味着 5 万条记录可能需要 2-4 小时。

所以我的问题是,是否有某种方法可以改进记录的插入,因为公司加载了 10 万条记录并进行日常计划,并且有 SLA 来满足作为平面文件订单的客户请求,并且必须处理一些大于 1 万的大文件(快速导入)。4小时导入6万应该减少到30分钟。

我正在考虑使用 DataAdapter 的 BatchSize 来发送多个存储过程调用,SQL Bulk 插入来批量从 DataReader 或 DataTable 进行多个插入,SSIS 快速加载。但我不知道如何正确分析重新索引和统计人口,也许这需要一些时间才能完成。更糟糕的是,该公司使用最大的表进行报告和其他在线处理,并且无法删除索引。我通过将字段设置为一个值来手动管理事务,并进行事务更新,将该值更改为其他应用程序用来获取已提交行的新值。

请告知如何解决这个问题。现在,我正在尝试在单独的数据库中使用最少的日志记录和没有索引的登台表,我将尝试进行批量(大量)父子插入。我相信生产数据库具有简单的恢复模型,但它可能是完全恢复。如果我的 .NET 控制台应用程序正在使用的 DB 用户具有 bulkadmin 角色,这是否意味着它的批量插入被最低限度地记录。我知道当一个表已经聚集并且许多非聚集索引插入时,仍然会为每一行记录。

连接池正在工作,但有很多登录/注销。为什么?

for (int i = 1; i <= 10000; i++){ using (SqlConnection conn = new SqlConnection("server=(local);database=master;integrated security=sspi;")) {conn.Open(); 使用 (SqlCommand cmd = conn.CreateCommand()){ cmd.CommandText = "使用 tempdb"; cmd.ExecuteNonQuery();}}}

SQL Server Profiler 跟踪:

审核登录主控 2010-01-13 23:18:45.337 1 - 非池化
SQL:BatchStarting 使用 tempdb 主控 2010-01-13 23:18:45.337
RPC:启动 exec sp_reset_conn tempdb 2010-01-13 23:18:45.337
审核注销tempdb 2010-01-13 23:18:45.337 2 - 池
审核登录 - 网络协议主控 2010-01-13 23:18:45.383 2 - 池
化 SQL:BatchStarting 使用 tempdb 主控 2010-01-13 23:18:45.383
RPC:启动 exec sp_reset_conn tempdb 2010-01-13 23:18:45.383

审核注销 tempdb 2010-01-13 23:18:45.383 2 - 池化
审核登录 -- 网络协议主控 2010-01-13 23:18:45.383 2 - 池
化 SQL:BatchStarting 使用 tempdb 主控 2010-01-13 23:18:45.383
RPC:启动 exec sp_reset_conn tempdb 2010-01-13 23:18 :45.383
审核注销 tempdb 2010-01-13 23:18:45.383 2 - 合并

0 投票
1 回答
4115 浏览

c# - 使用生产者/消费者模式和 SqlBulkCopy 使用多线程将平面文件分块处理到 SQL Server DB

我希望你能忍受我。我想提供尽可能多的信息。主要问题是如何创建将由多个线程使用的结构(如堆栈),该结构将弹出一个值并使用它来处理一个大平面文件,并可能一次又一次地循环直到处理整个文件。如果一个文件有 100.000 条记录,可由 5 个线程使用 2.000 个行块处理,那么每个线程将获得 10 个块来处理。

我的目标是在平面文件中移动数据(带有 Header...Subheader...Detail, Detail, Detail, ...Detail, SubFooter, Subheader...Detail, Detail, Detail, ...Detail, SubFooter, Subheader...Detail, Detail, Detail, ...Detail, SubFooter, Footer structure) 到具有简单恢复模式的 OLTP DB 中(可能是完整的)到 3 个表中:第一个表示 Subheader 行中存在的 Subheader 唯一键,第二个中间表 SubheaderGroup,表示 2000 条记录块中的详细信息行的分组(需要将 Subheader 的 Identity PK 作为其 FK,第三个表示 FK 指向 Subheader PK 的详细信息行。

我正在执行手动事务管理,因为我可以拥有数万个详细信息行,并且我在加载期间使用在目标表中设置为 0 的特殊字段,然后在文件处理结束时我正在执行事务更新更改此值为 1 可以指示其他应用程序加载完成。

我想将此平面文件切成多个相等的部分(相同的行数),可以使用多个线程处理并使用 SqlBulkCopy 使用 IDataReader 导入,该 IDataReader 是从目标表元数据创建的)。

我想使用生产者/消费者模式(如下面的链接中所述 - pdf 分析和代码示例)将 SqlBulkCopy 与 SqlBulkCopyOptions.TableLock 选项一起使用。 http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx 这种模式可以创建多个生产者,并且等量的消费者需要订阅生产者才能消费该行。

在TestSqlBulkCopy 项目中,DataProducer.cs 文件中有一个方法可以模拟生产数千条记录。

此方法将在新线程的上下文中执行。我希望这个新线程只读取原始平面文件的唯一块,另一个线程将开始处理下一个块。然后,消费者将使用 SqlBulkCopy ADO.NET 类将数据(泵送给他们)移动到 SQL Server DB。

所以这里的问题是关于主程序规定每个线程应该处理什么 lineFrom 到 lineTo ,我认为这应该在线程创建期间发生。第二种解决方案可能是让线程共享一些结构并使用它们独有的东西(如线程号或序列号)来查找共享结构(可能是堆栈并弹出一个值(在执行此操作时锁定堆栈),然后下一个线程将然后选取下一个值。主程序将选取平面文件并确定块的大小并创建堆栈。

那么有人可以提供一些代码片段,关于多个线程如何处理一个文件并且只获得该文件的唯一部分的伪代码吗?

谢谢,拉德

0 投票
1 回答
531 浏览

sql - 在sql中复制数据时添加列

我正在使用 SqlBulkCopy 将一些记录从一个表批量插入到另一个表中。该查询使用 SqlDataReader 来获取数据。表之间重要的一个区别(除了在映射中处理的列顺序)是目标表有一个日期列,需要将当前日期添加到该列中。此日期不在源表中。我怎样才能将它添加到当前工作正常的进程中减去这个?

当前的工作代码如下所示:

数据库是 sql 2008 ENT。

0 投票
2 回答
10167 浏览

c# - SqlBulkCopy.WriteToServer 不可靠地遵守 BulkCopyTimeout

我需要计算来自 SqlBulkCopy 的连续超时异常。为了测试这一点,我使用外部应用程序启动事务并锁定目标表。

只有在第一次调用时,SqlBulkCopy 才会在预期时抛出超时异常。我们尝试过使用外部连接和事务,以及使用连接字符串和内部事务。对于外部连接和事务,无限等待永远不会在打开连接或开始或提交事务时,而是始终在.WriteToServer().

是否有某种方法可以SqlBulkCopy.WriteToServer()在达到.BulkCopyTimeout极限时可靠地抛出超时异常?

我更喜欢让异常冒泡而不是在using块的范围内处理它们,但我总是可以重新抛出。非常感谢您的任何见解。

更新1:

还是没有解决。但是发现了有趣的行为——正常的 SqlCommand 将在同一锁定期间按预期抛出 TimeoutException,这使 SqlBulkCopy.WriteToServer 方法无限期挂起。

以下是我们尝试过的方法——但都失败了——让 SqlBulkCopy.WriteToServer 在预期的时候持续抛出超时:

  • MARS(多个活动结果集)开/关
  • TableLock 开启与关闭
  • 目的地作为堆表与索引表
  • 更长/更短的 BulkTimeout 值(10 秒到 5 分钟)
  • 内部与外部交易

现在,作为一种解决方法,我在 a) 将 WriteToServer 调用放在异步包装器中以便我可以自己计时,以及 b) 只调用 WriteToServer 一次;超时后,等到常规 SqlCommand成功后再尝试 WriteToServer。使用这些方法,我至少能够控制执行流程。

0 投票
1 回答
7779 浏览

c# - 回滚批量复制

我有一个应用程序,它通过 c# 中的批量复制类从我的数据库中复制。

发生异常时可以回滚sql server中的批量复制操作吗?

0 投票
2 回答
9571 浏览

c# - SqlBulkCopy WriteToServer 示例。我究竟做错了什么?

这可能很长,但我想解释一下我的例子

我得到了这个代码:

当我运行它时,我在子表的 FK 列中得到了“看起来”正确的数据。(0和1)问题是,保存后,数据进入数据库,但并不完全正确。我没有从父表中获得 FK id,而是从 C# 代码中获得了 0 和 1。注意:数据库中的表确实有 FK 约束。您不能手动添加这些东西,但是 SqlBulkCopy WriteToServer 没有问题,无论如何都会写入错误的数据(就像没有检查约束一样)

看表:

结果如下所示:

我究竟做错了什么?可能我不应该在 C# 中得到这样的 ID。但是怎么做?或者甚至有可能吗?我的意思是我的第二个bulkinsert 是如何知道SQL 的!!!!插入ID?

0 投票
3 回答
22043 浏览

c# - 从类型化列表中获取 IDataReader

我有List<MyObject>一百万个元素。(它实际上是一个 SubSonic Collection,但它不是从数据库中加载的)。

我目前正在使用SqlBulkCopy如下:

我使用 SubSonic 的 MyObjectCollection.ToDataTable() 从我的集合中构建 DataTable。但是,这会复制内存中的对象并且效率低下。我想使用使用 IDataReader 而不是 DataTable 的 SqlBulkCopy.WriteToServer 方法,这样我就不会在内存中复制我的集合。

从我的列表中获取 IDataReader 的最简单方法是什么?我想我可以实现一个自定义数据阅读器(比如这里http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/05/06/implementing-sqlbulkcopy-in-linq-to-sql.aspx) ,但是我必须做一些更简单的事情,而无需编写一堆通用代码。

编辑:似乎无法从对象集合中轻松生成 IDataReader。即使我希望在框架中内置一些东西,也接受当前的答案。

0 投票
2 回答
176 浏览

sql - SqlBulkCopy 的数据库引擎独立模拟

什么是加载大量数据的最佳数据库引擎独立方式。

当我使用 SQL Server 时,我使用 SqlBulkCopy 但想从 SQL Server 中解开

0 投票
1 回答
864 浏览

sql-server - bcp 命令执行不连贯

我在 2 台计算机上执行 bcp 命令。第一台电脑有windows xp,第二台有windows server 2003。当我第一次执行命令时,bcp运行成功,但是当我在第二台电脑上运行时,出现此错误:

问题是什么?