标签: sqlbulkcopy

SqlBulkInsert - 如何设置Fire触发器,检查约束?

我正在使用具有有限权限的数据库用户,使用C#方法将ADO.NET 2.0 SqlBulkCopy对象批量插入到MS SQL 2005数据库中.当我尝试运行该操作时,我收到错误消息:

批量复制失败.用户对表'theTable'没有ALTER TABLE权限.ALTER TABLE权限是必需上批量复制操作的目标表,如果该表具有触发器或检查约束,但'FIRE_TRIGGERS'还是 'CHECK_CONSTRAINTS'散装提示没有被指定为选项,以批量复制命令.

我阅读了一些文档并使用构造函数创建了批量复制对象,该构造函数允许我指定这样的东西:

    SqlBulkCopy bc = new SqlBulkCopy(
        System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"],
        SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints);
Run Code Online (Sandbox Code Playgroud)

但这并没有改变任何东西 - 我得到了和以前一样的错误信息.我尝试摆弄其他一些SqlBulkCopyOptions值,但没有运气.我真的以为这会解决这个问题,我错过了什么吗?

我在表上向用户授予ALTER后测试了该过程,操作成功.但是,这不适合我的情况.

ado.net sql-server-2005 sqlbulkcopy

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

使用SqlBulkCopy插入数据时出错

我正在尝试使用批量插入数据到SQL 2008 SqlBulkCopy.

这是我的表:

IF OBJECT_ID(N'statement', N'U') IS NOT NULL
DROP TABLE [statement]
GO
CREATE TABLE [statement](
  [ID] INT IDENTITY(1, 1) NOT NULL,
  [date] DATE NOT NULL DEFAULT GETDATE(),
  [amount] DECIMAL(14,2) NOT NULL,
CONSTRAINT [PK_statement] PRIMARY KEY CLUSTERED
(
    [ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

private DataTable GetTable()
{
    var list = new List<DataColumn>();
    list.Add(new DataColumn("amount", typeof(SqlDecimal)));
    list.Add(new DataColumn("date", …
Run Code Online (Sandbox Code Playgroud)

c# sql-server ado.net datetime sqlbulkcopy

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

SqlBulkCopy无法访问表

在Excel表(以transferTable)看完后,我想将数据添加到使用SqlBulkCopy的新表(destinationTable会),但我得到的错误:

Cannot access destination table 'test'
Run Code Online (Sandbox Code Playgroud)

我尝试使用默认的表名并使用方括号,但这不起作用.

有什么建议?

private void writeToDBButton_Click(object sender, EventArgs e) {
    MakeTable();
    destinationTable.TableName = "test";
    testDBDataSet.Tables.Add("test");

    // Connects to the sql-server using Connection.cs
    SqlConnection connection = Connection.GetConnection();

    using (connection) {
        connection.Open();

        // Uses SqlBulkCopy to copy the data from our transferTable to the destinationTable
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) {
            bulkCopy.DestinationTableName = destinationTable.TableName;

            try {
                // Write from the source to the destination.
                bulkCopy.WriteToServer(transferTable);
                this.dataGridView2.DataSource = destinationTable;
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }

            connection.Close(); …
Run Code Online (Sandbox Code Playgroud)

c# database sql-server sqlbulkcopy

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

使用C#在SQL Server上的临时表中插入3万行的最快方法

我试图找出如何使用c#在SQL Server的临时表中提高插入性能.有些人说我应该使用SQLBulkCopy但是我必须做错了,因为它似乎比简单地构建一个SQL插入字符串慢得多.

我使用SQLBulkCopy创建表的代码如下:

public void MakeTable(string tableName, List<string> ids, SqlConnection connection)
    {

        SqlCommand cmd = new SqlCommand("CREATE TABLE ##" + tableName + " (ID int)", connection);
        cmd.ExecuteNonQuery();

        DataTable localTempTable = new DataTable(tableName);

        DataColumn id = new DataColumn();
        id.DataType = System.Type.GetType("System.Int32");
        id.ColumnName = "ID";
        localTempTable.Columns.Add(id);

        foreach (var item in ids)
        {
             DataRow row = localTempTable.NewRow();
             row[0] = item;
             localTempTable.Rows.Add(row);
             localTempTable.AcceptChanges();
        }


        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
        {
            bulkCopy.DestinationTableName = "##" + tableName;
            bulkCopy.WriteToServer(localTempTable);

        }
    }
Run Code Online (Sandbox Code Playgroud)

这样我的插入需要很长时间才能运行.我让插件以另一种方式更快地工作:

我将insert位创建为一个字符串,并在我的SQL create temp table语句中加入它: …

c# sql sql-server bulkinsert sqlbulkcopy

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

sqlbulkcopy使用sql CE

是否可以将SqlBulkcopy与Sql Compact Edition一起使用,例如(*.sdf)文件?

我知道它适用于SQL Server 200 Up,但想检查CE兼容性.

如果没有其他人知道在不使用DataSet的情况下将CSV类型文件放入SQL Server CE的最快方法(请点击这里)?

c# sqlbulkcopy sql-server-ce

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

SQLBulkCopy或批量插入

我有大约6500个文件,总和大约17 GB的数据,这是我第一次移动我称之为大量数据的东西.数据位于网络驱动器上,但各个文件相对较小(最大7 MB).

我正在用C#编写程序,如果我使用BULK INSERT而不是SQLBulkCopy,我想知道是否会注意到性能的显着差异.服务器上的表也有一个额外的列,所以如果我使用BULK INSERT,我将不得不使用格式文件,然后为每一行运行UPDATE.

我是新来的论坛,所以如果有更好的方式来问这个问题,请随意提及.

c# sql performance bulkinsert sqlbulkcopy

13
推荐指数
1
解决办法
6912
查看次数

百万插入:SqlBulkCopy超时

我们已经有一个运行系统来处理所有连接字符串(db2,oracle,MSServer).

目前,我们正在使用ExecuteNonQuery()一些插入.

我们希望通过使用SqlBulkCopy()而不是改进性能ExecuteNonQuery().我们有一些客户拥有超过5000万条记录.

我们不想使用SSIS,因为我们的系统支持多个数据库.

我创建了一个示例项目来测试其性能SqlBulkCopy().我为MSServer创建了一个简单的读取和插入函数

这是小功能:

public void insertIntoSQLServer()
{
    using (SqlConnection SourceConnection = new SqlConnection(_sourceConnectionString))
    {
        //Open the connection to get the data from the source table
        SourceConnection.Open();
        using (SqlCommand command = new SqlCommand("select * from " + _sourceSchemaName + "." + _sourceTableName + ";", SourceConnection))
        {
            //Read from the source table
            command.CommandTimeout = 2400;
            SqlDataReader reader = command.ExecuteReader();

            using (SqlConnection …
Run Code Online (Sandbox Code Playgroud)

c# sql-server bulkinsert sqldatareader sqlbulkcopy

13
推荐指数
2
解决办法
9761
查看次数

如何使用SqlBulkCopyColumnMappingCollection?

我想通过参数传递特定数据,制作一个可用于所有批量插入的SqlBulkCopy方法.

现在我需要对其中一些进行映射.我不知道如何制作SqlBulkCopyColumnMappingCollection,因为那是我计划传递映射集合并使用它.但是我不知道如何制作它.我不能成为它的新对象.

这就是我现在拥有的.如何添加它做映射把它传递进去?

public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize)
{
    // Get the DataTable 
    DataTable dtInsertRows = dataTable;

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
    {
        sbc.DestinationTableName = DestinationTbl;

        // Number of records to be processed in one go
        sbc.BatchSize = batchSize;

        // Finally write to server
        sbc.WriteToServer(dtInsertRows);
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# sqlbulkcopy columnmappings

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

奇怪的"OLE DB提供程序'STREAM'用于链接服务器'(null)'返回列'[!BulkInsert] .Value'错误的无效数据

使用的软件:Windows 7 64位Ultimate,.Net 4,SQL Server 2008 R2.

select @@ version返回:

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64)   Apr 22 2011 19:23:43   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) 
Run Code Online (Sandbox Code Playgroud)

要重现,并假设您有本地sql server 2008 R2实例,请将以下代码粘贴到linqpad中并将其作为程序运行.

它爆炸了:

链接服务器'(null)'的OLE DB提供程序'STREAM'返回列'[!BulkInsert] .Value'的无效数据.

void Main()
{
  SqlConnection cn = new SqlConnection("data source=localhost;Integrated Security=SSPI;initial catalog=tempdb;Connect Timeout=180;");
  cn.Open();

  IList<decimal> list = new List<decimal>() {-8m, 8m};

  decimal result = list.Sum(x => x);

  Console.WriteLine(result == 0);

  string tableName …
Run Code Online (Sandbox Code Playgroud)

sqlbulkcopy sql-server-2008-r2 c#-4.0

12
推荐指数
3
解决办法
8135
查看次数

从.NET代码插入SQL Server表的最快方法?

最快的方法是:

  • 一个表,没有我无法预填的参考(即那里有一个参考密钥,但我填写了所有数据)
  • 很多数据.我们每天谈论数亿行,通过API动态进行
  • 必须/应该在近乎实时的情况下尽快处理请求(即没有写入文件以便每天上传一个).2秒是正常的最大延迟
  • 用于数据/应用程序和SQL Server的独立机器

我现在应该做什么:

  • 将最多32*1024行聚合到一个数组中,然后对其进行排队.
  • 用2-3个线程读取队列.使用SqlBulkCopy插入数据库.

我每秒输入大约60k-75k行,这还不够,但非常接近.我想要达到250.000行.

到目前为止还没有真正使用过.我得到20%的时间"网络I/O"块,有一个核心80%加载CPU端.光盘写出7mb-14mb,大部分是空闲的.RAID 10上的6个raptors的平均队列长度是...... 0.25.

任何人都知道如何加快速度?更快的服务器(到目前为止它是虚拟的,8GB RAM,4个核心,物理磁盘通过数据).


添加一些说明:

  • 这是2008 R2服务器上的2008 R2 Enterprise SQL Server.机器有4个核心,8gb内存.全64位.平均80%的负载来自这台机器,显示大约20%的CPU负载.
  • 该表很简单,没有主键,只有关系引用(工具引用)上的索引和唯一(在一组工具中,因此不强制执行)时间戳.
  • 上表中的字段包括:时间戳,仪器参照(无强制外键),数据类型(字符1,一个数字,指示帐什么数据字符中的一个),价格(双)和体积(INT).正如您所看到的,这是一张非常薄的桌子.有问题的数据是金融工具的刻度数据.
  • 问题还在于硬件等 - 主要是因为我没有看到真正的瓶颈.我插入多个交易,它给了我一个好处,但一个小的.光盘,CPU没有显示显著负载,网络IO等待高(300毫秒/秒,此刻的30%),但这是它运行仅仅指刚两台服务器,并具有足够的核心来运行所有相同的虚拟化平台上.我几乎愿意"购买另一台服务器",但我想首先确定瓶颈....特别是考虑到在一天结束时我并没有抓住瓶颈是什么.日志记录无关紧要 - 批量插入不会作为数据(没有聚集索引)进入数据日志.

垂直分区是否有助于,例如通过一个字节(tinyint)将仪器世界分开,例如16个表格,因此我最多同时进行16次插入?实际上,数据来自不同的交易所,我可以为每个交易所制作一个分区.这将是一个自然的分裂场(实际上是在乐器中,但我可以在这里复制这些数据).


更多澄清:速度更高(90k),现在明显受到机器之间的网络IO的限制,这可能是VM切换.

我现在要做的就是做每32K行的连接,搭起一个临时表,插入此与SqlBUlkdCopy,然后用一条SQL语句复制到主表 - 在主表最大限度地减少任何锁定时间.

大多数等待时间现在仍在网络IO上.似乎我遇到了VM明智的问题.将在未来几个月转移到物理硬件;)

sqlbulkcopy sql-server-2008

11
推荐指数
1
解决办法
4325
查看次数