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

このようにしてみてください

  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 に答える
2

ソースvarchar列の照合は、宛先varchar列の照合とは異なります。

最初にデータテーブルにロードするとこれを回避できますが、大量のデータをロードしている場合は、System.OutOfMemoryExceptionが発生する可能性があります。

于 2012-12-21T14:42:42.757 に答える
1

ソーステーブルと宛先テーブルの列の照合は同じであると主張しますが、少なくともこの1つの特定の列では、明らかに異なります。

DataReaderに直接渡すことによるパフォーマンス上の利点を排除することも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値を挿入するときに発生します。この場合、テーブルの「ロケール」(照合)設定は異なります。

これは通常、あるデータベースから別のデータベースへの一括コピー操作で見られます。これは、2つのデータベースの照合構成が異なる場合があるためです。

この問題を防ぐ1つの方法は、すべての照合可能な(char、varchar、またはnvarchar)列にISNULLを使用して、NULLが決して入力されないようにすることです。

しかし、あなたの

SELECT * 

あいまいであり、可能な限り避ける必要があります。SELECTにいくつかのNULL列があり、選択する列を指定していないため、ISNULLを使用してNULL値が挿入されないようにすることはできません。

于 2021-12-29T16:37:52.310 に答える