标签: sqlbulkcopy

SqlBulkCopy 运行 WriteToServer(DataTable) 时抛出 System.FormatException

目前我正在编写一种从 CSV 文件读取数据并导入到 SQL 表的方法。

        DataTable dt = new DataTable();
        String line = null;
        int i = 0;

        while ((line = reader.ReadLine()) != null)
        {
            String[] data = line.Split(',');
            if (data.Length > 0)
            {
                if (i == 0)
                {
                    foreach (object item in data)
                    {
                        DataColumn c = new DataColumn(Convert.ToString(item));
                        if (Convert.ToString(item).Contains("DATE"))
                        {
                            c.DataType = System.Type.GetType("System.DateTime");
                        }
                        else { c.DataType = System.Type.GetType("System.String"); }
                        dt.Columns.Add(c);
                    }
                    i++;
                }
                else
                {
                    DataRow row = dt.NewRow();
                    for (int j = 0; j < …
Run Code Online (Sandbox Code Playgroud)

c# sql csv sqlbulkcopy formatexception

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

如何以索引方式有效地存储所有OpenStreetMap数据?

注意:虽然我的目标是Windows Phone 7,但除了大小限制外,它不会引入任何内容.

为了尝试为Windows Phone 7编写GPS /路由/地图应用程序,我正在尝试使用OpenStreetMap,我希望将我的数据存储在Windows Phone 7上的SQL Server Compact Edition数据库中.这给我带来了很多麻烦,所以我正在弄清楚正确的方法是什么......

这是我的进步:

  1. 我已下载Belgium.osm.pbf,其中包含PBF格式的所有比利时OSM数据.

    请注意,比利时并不是那么大,这是我居住的国家,所以它似乎是一个良好的开端.

    如果我的数据库接近该PBF文件的大小,那将是很好的,因为它只有80 MB ...

  2. 使用Marc Gravell的protobuf-net,我现在编写了一个解析器,它给了我所有的OSM数据.

  3. 在第一次尝试时,我试图将其全部加载到内存中,但这似乎对我的Windows Phone 7来说太大了,因为它导致大小> 512 MB.然后我的想法是我需要一个数据库来存储这些信息,所以将它存储在SQL Server Compact Edition sdf文件中似乎是逻辑.

  4. 因此,我在LINQ to SQL中创建了以下DataContext和Tables:

    public class RoutingContext : DataContext
    {
        public RoutingContext()
    #if WINDOWS_PHONE
            : base("Data Source = 'isostore:/RoutingDB.sdf'; Max Database Size = 1024; Max Buffer Size = 65536")
    #else
            : base("Data Source = './RoutingDB.sdf'; Max Database Size …
    Run Code Online (Sandbox Code Playgroud)

sqlbulkcopy openstreetmap sql-server-ce linq-to-sql

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

带有标识的SQLBulkCopy在目标表中插入

我试图用SQLBulkCopy向SQL Server插入一个通用列表,

我在Identity Field遇到麻烦

我想要我的目标表来生成标识字段我应该如何处理这个,这是我的代码

using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
                {
                    bulkCopy.BatchSize = (int)DetailLines;
                    bulkCopy.DestinationTableName = "dbo.tMyTable";

                    var table = new DataTable();
                    var props = TypeDescriptor.GetProperties(typeof(tBFFormularyStatusList))
                        //Dirty hack to make sure we only have system data types 
                        //i.e. filter out the relationships/collections
                                               .Cast<PropertyDescriptor>()
                                               .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System"))
                                               .ToArray();
                    foreach (var propertyInfo in props)
                    {
                        bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
                        table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
                    }

                    var values = new object[props.Length];
                    foreach (var item in myGenericList)
                    {
                        for (var i = 0; i < values.Length; …
Run Code Online (Sandbox Code Playgroud)

sqlbulkcopy sql-server-2008 c#-4.0

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

LINQ 实体数据读取器不支持枚举

我必须批量插入很多实体,所以我想最好的方法是使用SqlBulkCopy类。但是,该类对DataReader实例进行操作,而我的代码使用 IEnumerable,其中 T 是我的实体类。要将我的 IEnumerable 转换为 DataReader,我找到了以下代码:LINQ Entity Data Reader。

这段代码工作正常,但有一个问题:我的实体类型上的枚举属性未包含在数据读取器中(因此未正确插入)。如何识别枚举类型的属性?

enums entity-framework sqlbulkcopy

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

BulkCopy错误:源列'CreatedBy'的区域设置ID'1025'和目标列'CreatedBy'的区域设置ID'1033'不匹配

我正在使用SqlBulkCopy类执行SQL批量复制。我创建了目标表,使其与源表完全相同。它们都具有相同的表名,列名,数据类型,甚至具有相同的排序规则。我也做了sql映射以确保准确性。

我的代码如下:

SqlConnection SourceConnection =  new SqlConnection(SourceConnectionString);
SqlConnection DestinationConnection =  new SqlConnection(DestinationConnectionString);

DestinationConnection.Open();
SourceConnection.Open();

SqlCommand commandSourceData = new SqlCommand("SELECT * FROM Requisitions;", SourceConnection);

SqlDataReader reader = commandSourceData.ExecuteReader();    

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(DestinationConnection))

    {
           bulkCopy.DestinationTableName = "Requisitions";


           bulkCopy.ColumnMappings.Add("RequisitionId", "RequisitionId");
           bulkCopy.ColumnMappings.Add("CreatedBy", "CreatedBy");
           bulkCopy.ColumnMappings.Add("DateCreated", "DateCreated");
           bulkCopy.ColumnMappings.Add("AircraftTailNum", "AircraftTailNum");
           bulkCopy.ColumnMappings.Add("JobNumber", "JobNumber");
           bulkCopy.ColumnMappings.Add("ShopCode", "ShopCode");
           bulkCopy.ColumnMappings.Add("RequestedByName", "RequestedByName");
           bulkCopy.ColumnMappings.Add("RequestedById", "RequestedById");
           bulkCopy.ColumnMappings.Add("Status", "Status");
           bulkCopy.ColumnMappings.Add("IsCancelled", "IsCancelled");
           bulkCopy.ColumnMappings.Add("IsProcessed", "IsProcessed");


           try
               {
                  // Write from the source to the destination.
                  bulkCopy.WriteToServer(reader);
                }
          catch (Exception ex)
                {
                     Console.WriteLine(ex.Message);
                 }
          finally
                 {

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

c# sql-server asp.net sqlbulkcopy

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

从COPY命令获取行数

从文件复制数据时,使用"command tag"获取psql中的行数:

db=# COPY t FROM '/var/lib/postgres/test.sql';
COPY 10
Run Code Online (Sandbox Code Playgroud)

我需要行数,并希望避免count()表上的冗余.

有没有办法COPY直接从PL/pgSQL函数中获取这个数?
据我所知,没有,但也许我错过了什么?

对于PostgreSQL 9.2.但任何版本中的任何选项都会引起关注.

postgresql count plpgsql sqlbulkcopy

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

让SqlBulkCopy在MiniProfiler中显示为sql

我正在使用MiniProfiler来配置我的sql命令.

我正在处理的一个问题是由linq生成的重复INSERT语句.

我已将它们转换为SqlBulkCopy命令,但现在它似乎没有将它记录在MiniProfiler的sql视图中.

是否会为SqlBulkCopy提供相关的命令字符串?

是否可以将批量副本显示在sql命令列表中?

我至少可以在%sql位中计算它吗?


我知道我可以使用MiniProfiler.Current.Step("Doing Bulk Copy")但不会算作SQL,并且不会在列表中显示任何细节.


目前的代码如下:

public static void BulkInsertAll<T>(this DataContext dc, IEnumerable<T> entities)
{
    var conn = (dc.Connection as ProfiledDbConnection).InnerConnection as SqlConnection;
    conn.Open();

    Type t = typeof(T);

    var tableAttribute = (TableAttribute)t.GetCustomAttributes(
        typeof(TableAttribute), false).Single();
    var bulkCopy = new SqlBulkCopy(conn)
    {
        DestinationTableName = tableAttribute.Name
    };

    //....

    bulkCopy.WriteToServer(table);
}
Run Code Online (Sandbox Code Playgroud)

c# sqlbulkcopy mvc-mini-profiler

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

SqlBulkCopy到SqlServer 2008中的临时表

我需要将大量数据移动到sql server 2008数据库.我从源服务器获取数据并使用SqlBulkCopy写入目标服务器.必须从存储过程中解析此数据,然后将其删除.我想创建一个临时数据但是,如果我使用SqlCommand在客户端上创建临时数据,SqlBulkCopy可以访问该表并且工作正常,如果我在服务器上使用存储过程执行相同的脚本,则SqlBulkCopy.WriteToServer返回InvalidOperationException"无法访问目标表'#Tax'"

这是完美的代码:

SqlDataReader oSqlDataReader -> read form server source
SqlConnection oSqlConnection = new SqlConnection(_ConnectionTarget)
SqlCommand oSqlCommand = new SqlCommand("Create Table #Tax (Id int)", oSqlConnection);
oSqlCommand.CommandType = CommandType.Text;
oSqlCommand.CommandTimeout = 0;
oSqlCommand.ExecuteNonQuery();
SqlBulkCopy oSqlBulkCopy = new SqlBulkCopy(oSqlConnection)
oSqlBulkCopy.DestinationTableName = "#Tax";
oSqlBulkCopy.WriteToServer(oSqlDataReader);
Run Code Online (Sandbox Code Playgroud)

这是抛出InvalidOperationException异常的代码:

SqlDataReader oSqlDataReader -> read form server a
SqlConnection oSqlConnection = new SqlConnection(_ConnectionTarget)
SqlCommand oSqlCommand = new SqlCommand("SP_CreateTax", oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;
oSqlCommand.CommandTimeout = 0;
oSqlCommand.ExecuteNonQuery();
SqlBulkCopy oSqlBulkCopy = new SqlBulkCopy(oSqlConnection)
oSqlBulkCopy.DestinationTableName = "#Tax";
oSqlBulkCopy.WriteToServer(oSqlDataReader);
Run Code Online (Sandbox Code Playgroud)

SP_CreateTax:

Create Procedure …
Run Code Online (Sandbox Code Playgroud)

c# sqlbulkcopy sql-server-2008

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

SQL Server 2008 R2的可重试SQLBulkCopy

我基本上是从数据库背景和新的.net的东西.如果我的问题听起来很愚蠢,请耐心等待.

我在我的代码中使用SqlBulkCopy将数据从一个SQL Server传输到另一个SQL Server.但由于网络问题,它经常失败.为了避免这种情况,我打算做两件事

  1. 减小批量大小(从5000到1000)并增加超时(从3分钟到1分钟)

  2. 实现重试逻辑

我的问题是

  1. 实现重试的最佳方法是什么,即在表级或批处理级别(如果可能的话)?
  2. 我在这里找到了一些适用于弹性SQL Azure的框架:https://msdn.microsoft.com/en-us/library/hh680934(v = pandp.50) .aspx我们对SQL Server 2008 R2有什么类似的东西吗?

我正在使用的示例代码:

  private void BulkCopyTable(string schemaName, string tableName)
    {using (var reader = srcConnection.ExecuteReader($"select * from [{SourceDBName}].[{schemaName}].[{tableName}]"))
            {
                const SqlBulkCopyOptions bulkCopyOptions = SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers |
                                                           SqlBulkCopyOptions.KeepNulls | 
                                                           SqlBulkCopyOptions.KeepIdentity;

                using (var bcp = new SqlBulkCopy(dstConnection.ConnectionString, bulkCopyOptions))
                {
                    const int threeMinutes = 60*3;
                    bcp.BulkCopyTimeout = threeMinutes; //Timeout is for a single batch
                    bcp.BatchSize = 5000;
                    bcp.DestinationTableName = $"[{DestinationDB}].[{schemaName}].[{tableName}]";
                    bcp.EnableStreaming = true;
                    foreach (var col …
Run Code Online (Sandbox Code Playgroud)

.net c# sql-server sqlbulkcopy sql-server-2008-r2

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

进行批量插入时的 SQL Server 索引行为

我有一个应用程序可以一次将多行插入到 SQL Server 中。

我使用SqlBulkCopy类或自己编写的代码来生成一个巨大的insert into table_name(...) values (...)语句。

我的表有几个索引和一个聚集索引。

问题是:这些索引是如何更新的?对于我插入的每一行?每笔交易?

有点奇怪的问题 - 这种情况是否有一个通用术语,例如“批量插入索引行为”?我试图用谷歌搜索几个关键字组合,没有找到任何东西。我问的原因是因为我有时会使用 Postgres 并且也想知道它的行为。

我一直试图找到关于这个主题的文章,好几次了,没有任何运气。

如果你能指点我任何文档、文章或有相关章节的书,那就太好了

sql-server indexing bulkinsert sqlbulkcopy

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