标签: sqlbulkcopy

精确丢失而批量使用SqlBulkCopy将记录插入SQL

我使用以下代码批量插入数据表到我的SQL表:

 // Set up the bulk copy object.  
                using (SqlBulkCopy bulkCopy =
                           new SqlBulkCopy(destinationConnection.Connection))
                {
                    bulkCopy.DestinationTableName =
                        Constants.ReportDataTable;

                    // Write from the source to the destination.
                    DataTable dtBulk = GetDatatableInReportDataFormat(dt, objectName, version);
                    bulkCopy.WriteToServer(dtBulk);//To get the Datatable in the SQL table format

                }
Run Code Online (Sandbox Code Playgroud)

我的SQL表中有一个名为"Value"的列,其类型为十进制(28,5).我的问题是一些带有十进制数的值正在被自动舍入,因此我正在失去精度,例如将值0.72768保存为0.72767.

在Datatable中,"Value"列的类型为Double.

任何人都有想法吗?谢谢

.net sql bulkinsert sqlbulkcopy sql-server-2008

8
推荐指数
1
解决办法
2554
查看次数

如何从Ado.Net有效地调用表值参数

我需要有效地从Ado.Net向SQl Server 2008提交成千上万的数字和日期.在SQL 2008之前的日子里,我将这些数字打包在图像中,这非常快.Erland Sommarskog非常友好地将我的一些代码包含在SQL Server 2005的文章Arrays and Lists中

因为现在我们可以使用TVP,我尝试了它们.在客户端,我运行这个:

        dataTable = new DataTable();
        dataTable.Columns.Add("Date", typeof(DateTime));
        dataTable.Columns.Add("Price", typeof(decimal));
        dataTable.Rows.Add(new object[] { someDate, somePrice });
            command.CommandText = "Writers.SavePrices";
            command.CommandType = CommandType.StoredProcedure;
            var param = command.Parameters.AddWithValue("@Prices", dataTable);
            param.SqlDbType = SqlDbType.Structured;
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但我认为它没有效率.我启动了Profiler,我立即看到Ado.Net发出以下效率极低的SQL被发送到服务器:

DECLARE @Prices TABLE(...)
INSERT INTO @Prices(...)VALUES(...)
EXEC Writers.SavePrices @Prices=@Prices
Run Code Online (Sandbox Code Playgroud)

结果,在发送,解析和编译时浪费了服务器上的大量网络带宽和CPU.有没有更有效的方法来使用Ado.Net的TVP?

sql-server ado.net bulkinsert sqlbulkcopy sql-server-2008

7
推荐指数
1
解决办法
1231
查看次数

使用SqlBulkCopy和Azure进行并行批量插入

我在云上有一个带有sql azure数据库的天蓝色应用程序.我有一个worker角色,需要对文件进行解析+处理(最多约3000万行),所以我不能直接使用BCP或SSIS.

我目前正在使用SqlBulkCopy,但是这看起来太慢了,因为我看到400k行的加载时间长达4-5分钟.

我希望并行运行我的批量插入; 然而,阅读有关并行/控制锁行为导入数据的文章,它说SqlBulkCopy要求表没有聚簇索引,并且需要指定表锁(BU锁).但是,azure表必须具有聚簇索引...

甚至可以在SQL Azure中的同一个表上并行使用SqlBulkCopy吗?如果没有,那么还有另一个API(我可以在代码中使用)吗?

database parallel-processing sqlbulkcopy azure azure-sql-database

7
推荐指数
1
解决办法
4167
查看次数

SqlBulkCopy性能

我正在努力提高批量负载的性能; 100多万条记录+每日.

我把它移到了使用IDatareader接口来代替数据表,并且确实获得了显着的性能提升(每分钟500,000条记录).目前的设置是:

  • 用于解析分隔文件的自定义缓存读取器.
  • 将流读取器包装在缓冲流中.
  • 一个自定义对象读取器类,它枚举对象并实现IDatareader接口.
  • 然后SqlBulkCopy写入服务器

大部分性能瓶颈直接进入SqlBulkCopy.WriteToServer.如果我对过程进行单元测试,但只排除WriteToServer过程大约1分钟后返回.WriteToServer正在增加15分钟+.对于单元测试,它位于我的本地计算机上,因此数据库存在相同的驱动器,因此不必通过网络复制数据.

我正在使用堆表(没有索引;聚集或非聚集;我已经玩过各种批量大小而没有性能上的重大差异).

有必要减少加载时间,所以我希望有人可能现在可以从这个开局中挤出更多的血液.

c# sql-server sqlbulkcopy

7
推荐指数
1
解决办法
1万
查看次数

使用PostgreSQL COPY时出现"错误:上一个预期列之后的额外数据"

请耐心等待,因为这是我的第一篇文章.

我正在尝试在PostgreSQL-9.2中运行COPY命令,将.txt文件中的制表符分隔表添加到PostgreSQL数据库,例如:

COPY raw_data FROM '/home/Projects/TestData/raw_data.txt' WITH (DELIMITER ' ');
Run Code Online (Sandbox Code Playgroud)

我已经使用SQL命令在数据库中创建了一个名为"raw_data"的空表:

CREATE TABLE raw_data ();
Run Code Online (Sandbox Code Playgroud)

尝试运行该COPY命令时,我不断收到以下错误消息:

ERROR:  extra data after last expected column
CONTEXT:  COPY raw_data, line 1: "  1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  ..."
Run Code Online (Sandbox Code Playgroud)

(这里的数字应该是列标题)

我不确定它是否因为我在创建db表时没有指定表列但是我试图避免手动输入800或列.

对于如何解决这个问题,有任何的建议吗?

以下是.txt文件的示例:

        1   2   3   4   5   6 …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design dynamic-sql sqlbulkcopy

7
推荐指数
1
解决办法
1万
查看次数

带主键的批量复制不起作用

我有一个数据库表,包含列和主键。

我想从我的 c# 中的数据表进行批量复制。

当我的表中有主键时,我得到了异常,因为该表有 6 列,而我的数据表只有 5 列。

请问我该怎么办?

我应该将主键添加到我的 c# 中的数据表中吗?

(如果您需要任何代码请告诉我)

这是数据表

private DataTable getBasicDataTable()
        {
            DataTable dataTable = new DataTable();
            dataTable.Clear();
            dataTable.Columns.Add("customerID", typeof(int));
            dataTable.Columns.Add("firstName", typeof(string));
            dataTable.Columns.Add("lastName", typeof(string));
            dataTable.Columns.Add("showsNumber", typeof(int));
            dataTable.Columns.Add("visitNumber", typeof(int));
            dataTable.Columns.Add("cancellation", typeof(int));
            return dataTable;
        }
Run Code Online (Sandbox Code Playgroud)

但在我的数据库表中,我有完全相同的列,但有额外的ID主键,

笔记

当我删除数据库中的主键时,一切正常

c# sql datatable sqlbulkcopy

7
推荐指数
2
解决办法
2514
查看次数

从c#到SQL Server的批量插入策略

在我们当前的项目中,客户将向我们的系统发送复杂/嵌套消息的集合.这些消息的频率约为.1000-2000 msg /每秒.

这些复杂对象包含事务数据(要添加)以及主数据(如果未找到则将添加).但客户不是传递主数据的ID,而是传递"名称"列.

系统检查这些名称是否存在主数据.如果找到,它将使用数据库中的ID,否则首先创建此主数据,然后使用这些ID.

解析主数据ID后,系统会将事务数据插入SQL Server数据库(使用主数据ID).每条消息的主实体数量约为15-20.

以下是我们可以采取的一些策略.

  1. 我们可以首先从C#代码中解析master ID(如果没有找到则插入主数据)并将这些id存储在C#cache中.解决所有ID后,我们可以使用SqlBulkCopy类批量插入事务数据.我们可以访问数据库15次以获取不同实体的ID,然后再次命中数据库以插入最终数据.我们可以使用相同的连接在完成所有这些处理后关闭它.

  2. 我们可以将包含主数据和事务数据的所有这些消息一次性发送到数据库(以多个TVP的形式),然后在内部存储过程中,首先为缺失的数据创建主数据,然后插入事务数据.

有人可以建议这个用例的最佳方法吗?

由于一些隐私问题,我无法分享实际的对象结构.但这是假设的对象结构,它非常接近我们的业务对象.

其中一条消息将包含有关一个产品(其主数据)的信息以及来自不同供应商的价格详细信息(交易数据):

主数据(如果未找到则需要添加)

产品名称:ABC,ProductCateory:XYZ,制造商:XXX和其他一些细节(属性数量在15-20范围内).

交易数据(将始终添加)

供应商名称:A,ListPrice:XXX,折扣:XXX

供应商名称:B,ListPrice:XXX,折扣:XXX

供应商名称:C,ListPrice:XXX,折扣:XXX

供应商名称:D,ListPrice:XXX,折扣:XXX

对于属于一个产品的消息,大多数有关主数据的信息将保持不变(并且将更改频率更低),但事务数据将始终波动.因此,系统将检查系统中是否存在产品"XXX".如果没有,请检查本产品中提到的"类别"是否存在.如果没有,它将为类别插入新记录,然后为产品插入.这将针对制造商和其他主数据进行.

多个供应商将同时发送有关多个产品(2000-5000)的数据.

因此,假设我们有1000个供应商,每个供应商都在发送大约10-15种不同产品的数据.每2-3秒后,每个供应商都会向我们发送这10个产品的价格更新.他可能会开始发送有关新产品的数据,但这种情况并不常见.

c# sql-server bulkinsert sqlbulkcopy

7
推荐指数
1
解决办法
1379
查看次数

即使在为操作设置超时属性后也会出现超时异常

超时问题:

超时已过期.操作完成之前经过的超时时间或服务器没有响应.\ r \n语句已终止.

我有17亿条记录要转储到我的应用程序数据库中.这1200万条记录是2条数据库记录之间比较操作的结果.

我比较了2个数据库记录,然后在数据表中填充不匹配记录(基于某些条件),一旦该数据表达到1000或500等限制,我将此数据表发送到SQL批量复制以进行批量导入,然后清空数据表.

我在事务中执行整个操作,以便我插入X记录,在比较过程中出现任何错误,所以我将回滚那些X记录.

但正因为如此,我得到一个超时问题然后批量复制.

我检查了各种不同的batchsize like 5000,1000,500,300等等.我在所有批量大小中都出现了超时问题.

一旦我将批量复制超时设置为0,然后我将此错误发送到下面:

我的数据库的事务日志已满.

有1000条记录,它达到270万,然后抛出超时问题,

有500条记录,它达到了大约210万条记录然后抛出错误.

300,200,100也是抛出超时错误.

我还在连接字符串中将连接超时设置为30分钟.

代码:

public class SaveRepo : IDisposable
    {
        DataTable dataTable;
        SqlConnection connection;
        string connectionString;
        SqlTransaction transaction;
        SqlBulkCopy bulkCopy;
        int testId,

        public SaveRepo (int testId)//testId=10364
        {
            this.connectionString = connectionString;
            dataTable = new DataTable();
            connection = new SqlConnection(connectionString);
            connection.Open();
            transaction = connection.BeginTransaction();
            bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction);
            bulkCopy.BulkCopyTimeout = 60;
            bulkCopy.EnableStreaming = true;
            bulkCopy.DestinationTableName = "dbo.Sales";
            bulkCopy.BatchSize = 100;
            bulkCopy.SqlRowsCopied +=
                  new SqlRowsCopiedEventHandler(OnSqlRowsCopied); …
Run Code Online (Sandbox Code Playgroud)

c# sql-server ado.net sqlbulkcopy timeoutexception

7
推荐指数
1
解决办法
458
查看次数

选择into语句,其中source是其他数据库

如何将数据从一个数据库复制到具有相同表结构的另一个数据库并保留密钥标识?

我使用Sql Server 2012"Denali",我想从Sql Server 2008 DB复制一些数据.我拥有的表格完全相同,但我希望旧数据库中的数据进入新的"Denali"数据库.数据库位于不同的服务器上.

所以我想要类似的东西

USE newDB;
GO
SELECT *
INTO newTable
FROM OldDb.oldTable WITH (KEEPIDENTITY);
GO
Run Code Online (Sandbox Code Playgroud)

有人建议让这个可行吗?

sql sql-server sqlbulkcopy sql-server-2008 sql-server-2012

6
推荐指数
2
解决办法
2万
查看次数

从stdin的php postgresql pdo副本

COPY table_name ( field1, field2, field3) FROM STDIN CSV;
1,2,"q w"
3,4,"a s"
5,6,d
\.
Run Code Online (Sandbox Code Playgroud)

如何通过PDO执行此查询?

更新:

问题是PDO驱动程序将此查询作为语句执行.
例如,如果将其粘贴到pgAdmin中,则会引发错误.
我需要执行它psql:

C:\Users\User>psql -e -h localhost -U postgres db_name
psql (9.1.2)
db_name=# COPY table_name ( field1, field2, field3) FROM STDIN CSV;
COPY table_name ( field1, field2, field3) FROM STDIN CSV;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1,2,"q w"
>> 3,4,"a s"
>> 5,6,d
>> …
Run Code Online (Sandbox Code Playgroud)

php postgresql pdo sqlbulkcopy

6
推荐指数
1
解决办法
7014
查看次数