标签: sqlbulkcopy

SqlBulkCopy计算字段

我正在努力将数据库从MS Access移动到SQL Server.为了将数据移动到新表中,我决定编写一个同步例程,因为模式已经发生了很大变化,它允许我对运行它的程序运行测试,并在需要新的测试数据时重新同步.然后最终我将进行最后一次同步并在新的sql server版本上启动.

不幸的是我遇到了麻烦,我的方法是从Access到SQLServer的复制

public static void BulkCopyAccessToSQLServer
        (string sql, CommandType commandType, DBConnection sqlServerConnection,
            string destinationTable, DBConnection accessConnection, int timeout)
    {
        using (DataTable dt = new DataTable())
        using (OleDbConnection conn = new OleDbConnection(GetConnection(accessConnection)))
        using (OleDbCommand cmd = new OleDbCommand(sql, conn))
        using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
        {
            cmd.CommandType = commandType;
            cmd.Connection.Open();
            adapter.SelectCommand.CommandTimeout = timeout;
            adapter.Fill(dt);

            using (SqlConnection conn2 = new SqlConnection(GetConnection(sqlServerConnection)))
            using (SqlBulkCopy copy = new SqlBulkCopy(conn2))
            {
                conn2.Open();

                copy.DestinationTableName = destinationTable;
                copy.BatchSize = 1000;
                copy.BulkCopyTimeout = timeout;
                copy.WriteToServer(dt); …
Run Code Online (Sandbox Code Playgroud)

.net c# sql-server ms-access sqlbulkcopy

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

当表中存在依赖关系时,如何进行SqlBulkCopy?

当不依赖于表时,我可以使用以下代码执行 SqlBulkCopy:

//TableData and FieldData have column info in memory.  
using (SqlConnection connection = new SqlConnection(@"Data Source=WLO1;Initial Catalog=GenTest2;Integrated Security=True"))
        {

            connection.Open();
            foreach (string tableName in tablesInOrderToProcess)
            {
                if (tableDataList.ContainsKey(tableName))
                {
                    TableData td = tableDataList[tableName];

                    SqlBulkCopy copy = new SqlBulkCopy(connection);
                    copy.BatchSize = 10000;
                    copy.DestinationTableName = tableName;

                    System.Data.DataTable dt = new DataTable();
                    foreach (FieldData fd in td.FieldList.Values)
                    {
                        string fieldName = fd.Name;
                        string fieldDataType = fd.DataType;
                        string fieldSize = fd.Size.ToString(); ;
                        string fieldConstant = fd.constantValue;
                        string fieldAverage = fd.averageSize;
                        string fieldPickList = …
Run Code Online (Sandbox Code Playgroud)

c# sqlbulkcopy

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

使用SqlBulkCopy比使用DataTable有更快的方法吗?

我将大量记录加载到我的应用程序中(100万+)并对它们进行大量处理.处理要求它们都在内存中.

之后,我想将所有(现在已修改的)记录转储到空表中.

加载记录只需几秒钟,我最终得到了大量的MyRecord项目.

节省使用也SqlBulkCopy需要几秒钟.

但是SqlBulkCopy需要(我相信)a DataTable- 并将我的记录加载到一个DataTable缓慢的 - 每分钟约7500条记录使用

dataTable.Rows.Add(myRecord.Name, myRecord.Age, ....)
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来执行这个中间步骤?

c# sql-server sqlbulkcopy

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

在没有for循环的情况下从List创建DataTable的最快方法

我们有一个巨大的列表(比如100,000),需要转换DataTableSqlBulkcopy.

你能指导什么是最快的方法,而不使用for循环?现在我们这样做 - 在下面的代码listDos是对象列表

using (var dataTable = new DataTable(dataTableName))
{
    dataTable.Locale = CultureInfo.CurrentCulture;
    var columns = new[]
        {
             new DataColumn("Id", typeof(int)),
             new DataColumn("FkId", typeof(int)),
             new DataColumn("Status", typeof(string)),
             new DataColumn("RecordFrom", typeof(DateTime))
        };

    dataTable.Columns.AddRange(columns);


    foreach (ObjectDo listDo in listDos)
    {
        var row = dataTable.NewRow();

        if (rebuildDo.Id != null) row["Id"] = rebuildDo.Id;

        if (rebuildDo.FkId!= null) row["FkId"] = rebuildDo.FkId;

        row["Status"] = rebuildDo.Status;

        row["RecordFrom"] = rebuildDo.RecordFrom;

        dataTable.Rows.Add(row);
    }

    return dataTable;
}
Run Code Online (Sandbox Code Playgroud)

c# linq datacontext sqlbulkcopy linqdatasource

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

Entity Framework Core 和 SQLBulkCopy

SqlBulkCopy我已经使用实体框架很长时间了。我刚刚迁移到 Entity Framework Core。在我做类似的事情之前:

var itemsDT = jobs.ToDataTable<ProfileJob>();

using (var connection = new SqlConnection(_connStr))
{
    connection.Open();

    using (var bulkCopy = new SqlBulkCopy(connection))
    {
        bulkCopy.BatchSize = 1000;
        bulkCopy.DestinationTableName = "dbo.JobRemoveUniquePermissionsFailed";
        bulkCopy.WriteToServer(itemsDT);
    }
}
Run Code Online (Sandbox Code Playgroud)

ToDataTable是一个基于旧实体框架构建的大型扩展类。我还没有找到任何与 core 类似的样本。

有人有一个如何SqlBulkCopy与 EF Core 一起使用的小样本吗?

c# sqlbulkcopy

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

在插入数据库之前将String转换为位

任何人都可以帮助将C#中的字符串值转换为Sql中的等效位.我正在尝试将数据表的值批量复制到Sql表中.我在数据表中的所有值都是字符串格式.当我尝试批量复制到SQL表时,我遇到了bit数据类型列的错误.任何人都可以在我批量复制到SQL表之前发布C#代码将字符串转换为位类型.

谢谢,Vix

c# sql sql-server asp.net sqlbulkcopy

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

SqlBulkCopy WriteToServer方法在使用datatable时不写入任何数据

所有以下处理都在localmachine上进行:

我有一个源数据库(在服务器上)和一个目标数据库(本地机器).我有一个表格列表,我希望从源文件复制到目标,即服务器 - >本地.

我首先使用简单的SELECT*语句并使用Adpter.Fill(myDataTable)将来自服务器的所有数据存储在DataTable数组中,然后将myDataTable添加到DataTable数组中.

然后在本地我运行一个我在磁盘上的SQL脚本来删除本地数据库并重新创建它.使用[RightClick - > Tasks - > Generate Scripts]从SSMS获取脚本

删除并重新创建本地数据库后,我使用SqlBulkCopy和前面的DataTable数组将服务器数据复制到新创建的本地数据库中.


问题是,在我点击SqlBulkCopy部分之前,一切都按预期工作.我没有例外,没有消息,也没有触发的bcp_SqlRowsCopied事件.数据根本没有被复制过......这里发生了什么,我至少会发现某种错误......


以下是控制台应用程序的完整代码:请注意,它还没有生产就绪,因为还没有任何类型的错误处理.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.IO;
using System.Diagnostics;

namespace TomboDBSync
{
    class Program
    {
        //Names of all the tables to copy from the server (the source) to our local db (the destination)
        public static string[] tables = new string[] {"br_Make_Model", "br_Model_Series", "br_Product_EngineCapacity", "br_Product_ProductAttributeDescription", "CompanyPassword", "dtproperties", "EngineCapacity", "Make", "Model", "PetrolType", "Product", "ProductAttribute", "ProductAttributeDescription", "ProductsImport", "ProductType", …
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server sqlbulkcopy

0
推荐指数
1
解决办法
7822
查看次数

.NET BulkCopy仅在一次插入时触发触发

我对表上的每个插入执行触发器.我正在使用批量复制来对此表进行批量插入.我读过FireTriggers会在桌子上触发我的触发器,但它只进行一次,而不是每次插入.触发器从插入的项中获取一些数据,并将其插入另一个表中.我只看到在另一个表中插入了一行,而不是一行.我错过了一个选项吗?

var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default | SqlBulkCopyOptions.FireTriggers, transaction);
Run Code Online (Sandbox Code Playgroud)

.net c# sql-server triggers sqlbulkcopy

0
推荐指数
1
解决办法
1751
查看次数

带有隐式截断的 SqlBulkCopy

尝试使用 SqlBulkCopy 插入数据,我收到此错误:

从 bcp 客户端收到 colid 6 的无效列长度

他们推荐以下两件事之一:

  1. 增加数据库中的 varchar 大小(以容纳更大的字符串)
  2. 在上传之前手动截断DataTable中的字符串(用我自己的代码)(以使字符串大小合适)

但我很高兴发生“隐式截断”...(即数据库插入或 SqlBulkCopy 本身将用户提供的值削减到适当的大小)

问题:

  • 是否可以使用SqlBulkCopy并获得“隐式截断”行为,就像设置SqlCommand“ SET ANSI_WARNINGS OFF”时一样,以便“当OFF时,数据被截断为列的大小并且语句成功
  • 我可以更改数据库上的设置以允许“隐式截断”吗?
  • 是否有SqlBulkCopy 的替代方案可以实现此目的?
  • 或者也许我应该只使用推荐的方法之一(但我觉得自己手动截断数据表中的数据会降低性能?)

c# sql sqlbulkcopy

0
推荐指数
1
解决办法
3157
查看次数

BulkCopy WriteToServer()插入错误的列

我正在尝试DataTable在Sql Server上写入目标表.DataTable dt只包含一列及其调用Email.我的目标表中包含tpid,lastname,age,dateemail.这是我用于批量复制的代码:

using (SqlConnection sqlConn = new SqlConnection(sqlCs))
{
    sqlConn.Open();
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction))
    {
        bulkCopy.DestinationTableName = destinationTableName;
        bulkCopy.WriteToServer(dt);
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到的是,在我的目标表中,我从我的DataTable中获取了Email的值,tpid而不是插入到列中email.我这里没有使用列映射,但是不应该自动批量复制电子邮件电子邮件匹配?

c# sql sql-server datatable sqlbulkcopy

0
推荐指数
1
解决办法
1337
查看次数

在 SQL Server 中并行导入数据

我有 100 多个文件要导入 sql server,其中大部分是 500 MB。我想利用 SQL Server 的并行导入实用程序并阅读了许多网页,如下所示:

如何在 30 分钟内加载 1 TB 数据

https://technet.microsoft.com/en-us/library/dd537533(v=sql.100).aspx

使用表级锁定并行导入数据

https://technet.microsoft.com/en-us/library/ms186341(v=sql.105).aspx

控制批量导入的锁定行为

https://technet.microsoft.com/en-us/library/ms180876(v=sql.105).aspx

以及 stackoverflow 中的答案

并行插入单个表的最快方法

然而,他们都没有给出一个简单的代码示例。我知道如何使用批量插入/bcp,但我不知道从哪里开始并行导入?任何人都可以帮助我吗?

我的系统是Windows,我使用的是SQL server 2016。源数据文件为txt格式。

在此先感谢您的帮助!

杰森

sql-server parallel-processing bulkinsert sqlbulkcopy bulk-load

0
推荐指数
1
解决办法
1364
查看次数

从excel导入到Sql Server

我有一个任务是将Excel数据导入Sql server.excel数据来自excel模板.有不同的excel模板可用于不同的cleint,因此excel中的列在所有模板中都不相同.必须将数据导入到SQl的一个公共表中.

我用google搜索,网上有很多样本,但我无法确定哪种方法最好.

我可以请你指导我如何实现上述考虑模板的动态列.

在excel模板中,开始行和结束行不是固定的.

sql-server asp.net ssis bulkinsert sqlbulkcopy

-3
推荐指数
1
解决办法
1588
查看次数