5

我正在使用 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();
                  }
          }

但是,每次执行代码时,都会出现以下错误:

源列“CreatedBy”的区域设置 ID“1025”与目标列“CreatedBy”的区域设置 ID“1033”不匹配。

我在互联网上搜索了很多,但没有找到任何解决方案。如果有人帮助我,我将非常感激。

4

4 回答 4

2

源 varchar 列的排序规则与目标 varchar 列的排序规则不同。

首先加载到数据表可以解决这个问题,但是如果您正在加载大量数据,您可能会遇到 System.OutOfMemoryException。

于 2012-12-21T14:42:42.757 回答
2

像这样试试

  public DataTable fetchValue()
    {
        SqlDataAdapter dap=new SqlDataAdapter("SELECT RequisitionId,CreatedBy,DateCreated,AircraftTailNum,JobNumber,ShopCode,RequestedByName,RequestedById,Status,IsCancelled,IsProcessed FROM Requisitions;", cn);
        DataSet ds=new();
        dap.Fill(ds);
        return ds.Tables[0];
    }

        DataTable dtgenerate=new DataTable();
        dtgenerate=fetchValue();

       cn.open();
       using (SqlBulkCopy bulkCopy = new SqlBulkCopy(n))
       {
           bulkCopy.DestinationTableName = "Requisitions";//DestionTableName
           // bulkCopy.ColumnMappings.Add("SourceColumnIndex", "DestinationColumnIndex");  
           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");

           bulkCopy.WriteToServer(dtgenerate);
       }
       cn.close();
于 2012-12-10T10:49:37.233 回答
1

虽然您声称源表和目标表的列排序规则相同,但显然它们是不同的,至少对于这一特定列而言。

一种更简单的方法,既不消除DataReader直接传递 to的性能优势SqlBulkCopy,也不使用任何额外的内存,是简单地强制该列的排序规则成为目标排序规则。您可以通过指定SELECT而不是使用的列来执行此操作*(在任何情况下都是一个好习惯),然后您可以将COLLATE关键字添加到出现此错误的任何字符串列中。例如:

@"SELECT RequisitionId, CreatedBy COLLATE {destination_collation_name}, DateCreated,
         AircraftTailNum, JobNumber, ShopCode, RequestedByName, RequestedById,
         Status, IsCancelled, IsProcessed
 FROM    Requisitions;"
于 2018-05-17T15:01:32.060 回答
0

该错误通常发生在将 NULL 值从一个表插入到另一个表时,其中表具有不同的“区域设置”(排序规则)设置。

这通常出现在从一个数据库到另一个数据库的大容量复制操作中,因为这两个数据库可能具有不同的排序规则配置。

防止此问题的一种方法是对所有可排序(char、varchar 或 nvarchar)列使用 ISNULL,以确保永远不会在其中输入 NULL。

但是,您的

SELECT * 

含糊不清,应尽可能避免。很可能您的 SELECT 中有一些 NULL 列通过,并且由于您没有指定要选择的列,因此您不能使用 ISNULL 来防止插入 NULL 值。

于 2021-12-29T16:37:52.310 回答