SQL批量复制不适用于稀疏列

时间:2014-12-18 07:46:45

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

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

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

我的代码:

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与源或目标中的任何列不匹配

3 个答案:

答案 0 :(得分:0)

在批量复制中,列名称区分大小写。因此,如果您确定源和目标都有列,请检查列的名称是否匹配。如果源上指定的列名是"帐户"和目标列名称是" ACCOUNT"它不会有用。

答案 1 :(得分:0)

这不是因为列稀疏。我刚刚创建了测试应用程序,它将数据插入到具有稀疏列的表中,没有任何问题。看起来其中一个datacolumn名称在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();
        }
    }
}

答案 2 :(得分:0)

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

  

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

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