【问题标题】:SQL Bulk Copy not working with sparse columnSQL 批量复制不适用于稀疏列
【发布时间】:2014-12-18 07:46:45
【问题描述】:

我正在使用 C#SQLBulkCopy 类将多行插入到 SQL Server 2008 R2 中。它适用于普通表。 . 但不适用于具有 sparse 列的表。

我是否需要为 SQLBulkCopy 中的 sparse 列设置任何额外的设置?

我的代码:

using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.KeepIdentity, null))
    {         
       foreach (DataColumn item in objectData.Columns)
              {
                  sqlBulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName);
              }

          sqlBulkCopy.DestinationTableName = "[" + tableName + "]";
          sqlBulkCopy.WriteToServer(objectData);
     }

我收到此错误:

给定的 ColumnMapping 与源或目标中的任何列都不匹配

【问题讨论】:

  • 能否请您也展示一下您的作品?
  • @SonerGönül 我已经添加了我的代码
  • “不工作”是什么意思?错误代码?例外?
  • 我收到此错误:给定的 ColumnMapping 与源或目标中的任何列都不匹配
  • 请贴出objectData.Columns实际实例中的列列表和表列架构(SQL)

标签: c# sql-server sql-server-2008 sql-server-2008-r2 sqlbulkcopy


【解决方案1】:

在批量复制中,列名将区分大小写。因此,如果您确定源和目标都有列,请检查列的名称是否匹配。如果源中分配的列名是“Account”,而目标列名是“ACCOUNT”,则不会成功。

【讨论】:

    【解决方案2】:

    这不是因为稀疏的列。我刚刚创建了测试应用程序,它将数据插入到具有稀疏列的表中,没有问题。看起来数据列名称之一在 sql 表中没有对应的列。

    CREATE TABLE TestSparse
        (
          ID INT PRIMARY KEY ,
          Descript VARCHAR(20) SPARSE NULL ,
          Rate INT SPARSE NULL
        )
    
    namespace ConsoleApplication8
    {
        public class Test
        {
            public int ID;
            public string Descript;
            public int? Rate;
        }
        class Program
        {
            public static DataTable ToDataTable(List<Test> items)
            {
                DataTable table = new DataTable();
                table.Columns.Add("ID", typeof(int));
                table.Columns.Add("Descript", typeof(string));
                table.Columns.Add("Rate", typeof(int));
    
                foreach (Test item in items)
                {
                    DataRow row = table.NewRow();
                    row["ID"] = item.ID;
                    row["Descript"] = item.Descript;
                    if (item.Rate.HasValue) row["Rate"] = item.Rate;
                    else row["Rate"] = DBNull.Value;
    
                    table.Rows.Add(row);
                }
    
                return table;
            }
    
            static void Main(string[] args)
            {
                var list = new List<Test>();
                list.Add(new Test() { ID = 4, Descript = "1", Rate = 1 });
                list.Add(new Test() { ID = 5, Descript = "2", Rate = 2 });
                list.Add(new Test() { ID = 6, Descript = "3", Rate = 3 });
                list.Add(new Test() { ID = 7 });
                list.Add(new Test() { ID = 8, Descript = "3", Rate = 3 });
                list.Add(new Test() { ID = 9, Descript = "3", Rate = 3 });
    
                var Context = new Entities();
    
                SqlConnection ec = (SqlConnection)Context.Database.Connection;
    
                var copy = new SqlBulkCopy(ec, SqlBulkCopyOptions.CheckConstraints, null);
    
                copy.DestinationTableName = "dbo.TestSparse";
                copy.ColumnMappings.Add("ID", "ID");
                copy.ColumnMappings.Add("Descript", "Descript");
                copy.ColumnMappings.Add("Rate", "Rate");
    
                ec.Open();
                var table = ToDataTable(list);
                copy.WriteToServer(table);
                copy.Close();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      我认为,这不是因为稀疏的列。您的表中有列集吗?

      如果表具有 column_set,则稀疏列不会作为不同列处理。所有稀疏列的值都包含在column_set的值中,导出方式与XML列相同;也就是说,如果绑定为二进制类型,则为 varbinary(max),如果绑定为 char 或 wchar 类型,则为 nvarchar(max))。导入时,column_set 值必须符合 column_set 的架构。

      您可以在此处找到更多详细信息 Sparse Columns Support in SQL Server Native Client

      【讨论】:

        猜你喜欢
        • 2018-07-19
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多