簡體   English   中英

SQL批量復制不適用於稀疏列

[英]SQL Bulk Copy not working with sparse column

我正在使用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與源或目標中的任何列都不匹配

在批量復制中,列名將區分大小寫。 因此,如果您確定源和目標都有列,請檢查這些列的名稱是否匹配。 如果在源處分配的列名稱是“ Account”,而在目標列名稱是“ ACCOUNT”,則它將不起作用。

這不是因為列稀疏。 我剛剛創建了測試應用程序,它將數據插入具有稀疏列的表中,沒有問題。 看起來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();
        }
    }
}

我認為,這不是因為列稀疏。 您的表中是否有任何列集?

如果表具有column_set ,則稀疏列將不作為不同的列處理。 所有稀疏列的值都包含在column_set的值中,該值以與XML列相同的方式導出; 也就是說,如果綁定為二進制類型,則為varbinary(max);如果綁定為char或wchar類型,則為nvarchar(max )。 在導入時,column_set值必須符合column_set的模式。

您可以在此處找到更多詳細信息,SQL Server Native Client中的稀疏列支持

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM