20

DataSetExcelシートからデータが取り込まれています。SQLBulk Copy を使用して、PK であるLead_Hdrテーブルにレコードを挿入したいと考えていました。LeadId

以下のコードの実行中に次のエラーが発生します。

指定された ColumnMapping は、ソースまたは宛先のどの列とも一致しません

string ConStr=ConfigurationManager.ConnectionStrings["ConStr"].ToString();

using (SqlBulkCopy s = new SqlBulkCopy(ConStr,SqlBulkCopyOptions.KeepIdentity))
{
    if (MySql.State==ConnectionState.Closed)
    {
        MySql.Open();
    }

    s.DestinationTableName = "PCRM_Lead_Hdr";
    s.NotifyAfter = 10000;

    #region Comment
    s.ColumnMappings.Clear();

    #region ColumnMapping
    s.ColumnMappings.Add("ClientID", "ClientID");
    s.ColumnMappings.Add("LeadID", "LeadID");
    s.ColumnMappings.Add("Company_Name", "Company_Name");
    s.ColumnMappings.Add("Website", "Website");
    s.ColumnMappings.Add("EmployeeCount", "EmployeeCount");
    s.ColumnMappings.Add("Revenue", "Revenue");
    s.ColumnMappings.Add("Address", "Address");
    s.ColumnMappings.Add("City", "City");

    s.ColumnMappings.Add("State", "State");
    s.ColumnMappings.Add("ZipCode", "ZipCode");
    s.ColumnMappings.Add("CountryId", "CountryId");

    s.ColumnMappings.Add("Phone", "Phone");
    s.ColumnMappings.Add("Fax", "Fax");
    s.ColumnMappings.Add("TimeZone", "TimeZone");
    s.ColumnMappings.Add("SicNo", "SicNo");
    s.ColumnMappings.Add("SicDesc", "SicDesc");

    s.ColumnMappings.Add("SourceID", "SourceID");
    s.ColumnMappings.Add("ResearchAnalysis", "ResearchAnalysis");
    s.ColumnMappings.Add("BasketID", "BasketID");
    s.ColumnMappings.Add("PipeLineStatusId", "PipeLineStatusId");

    s.ColumnMappings.Add("SurveyId", "SurveyId");
    s.ColumnMappings.Add("NextCallDate", "NextCallDate");
    s.ColumnMappings.Add("CurrentRecStatus", "CurrentRecStatus");
    s.ColumnMappings.Add("AssignedUserId", "AssignedUserId");
    s.ColumnMappings.Add("AssignedDate", "AssignedDate");
    s.ColumnMappings.Add("ToValueAmt", "ToValueAmt");
    s.ColumnMappings.Add("Remove", "Remove");
    s.ColumnMappings.Add("Release", "Release");

    s.ColumnMappings.Add("Insert_Date", "Insert_Date");
    s.ColumnMappings.Add("Insert_By", "Insert_By");
    s.ColumnMappings.Add("Updated_Date", "Updated_Date");
    s.ColumnMappings.Add("Updated_By", "Updated_By");

    #endregion
    #endregion

    s.WriteToServer(sourceTable);

    s.Close();

    MySql.Close();
}
4

7 に答える 7

40

SQLSERVER 2005 へのアクセスからデータをコピーしているときに同じ問題が発生しました。データベースの機密性に関係なく、両方のデータ ソースで列マッピングが大文字と小文字を区別することがわかりました。

于 2010-04-09T11:27:10.223 に答える
22

さて、そうですか?列名は両側に存在しますか?

正直なところ、私はマッピングを気にしたことがありません。私は物事をシンプルに保つのが好きです - 私はサーバー上の入力のように見えるステージング テーブルを持つ傾向があり、次にSqlBulkCopyステージング テーブルに移動し、最後にストアド プロシージャを実行してテーブルをステージング テーブルから実際のテーブルに移動します。利点:

  • インポートがどこかの時点で失敗した場合でも、ライブ データが破損する問題はありません
  • SPROC のすぐ近くにトランザクションを置くことができます
  • SPROC がログに記録されることを知っていれば、ログを記録せずに bcp を動作させることができます。
  • それは簡単です;-p(マッピングをいじることはありません)

最終的な考えとして、大量のデータを扱っている場合は、を使用してスループットを向上させることができますIDataReader(これはストリーミング API であり、asDataTableはバッファー API であるため)。たとえば、私はCsvReader をSqlBulkCopyのソースとして使用して CSV インポートをフックする傾向があります。XmlReader別の方法として、最初のレベルの各要素を 1 行としてIDataReader非常に高速に表示するために、シムを作成しました。

于 2009-01-13T10:52:22.827 に答える
2

その理由の 1 つは、:SqlBukCOpy が大文字と小文字を区別することです。手順に従ってください:

  1. その場合、まず C# の「Contain」メソッドを使用して、ソース テーブルで列を見つける必要があります。
  2. Destination 列がソース列と一致したら、その列のインデックスを取得し、その列名を SqlBukCOpy に指定します。

例: `

//Get Column from Source table 
  string sourceTableQuery = "Select top 1 * from sourceTable";
   DataTable dtSource=SQLHelper.SqlHelper.ExecuteDataset(transaction, CommandType.Text, sourceTableQuery).Tables[0];// i use sql helper for executing query you can use corde sw

 for (int i = 0; i < destinationTable.Columns.Count; i++)
                        {    //check if destination Column Exists in Source table
                            if (dtSource.Columns.Contains(destinationTable.Columns[i].ToString()))//contain method is not case sensitive
                            {
                                int sourceColumnIndex = dtSource.Columns.IndexOf(destinationTable.Columns[i].ToString());//Once column matched get its index
                                bulkCopy.ColumnMappings.Add(dtSource.Columns[sourceColumnIndex].ToString(), dtSource.Columns[sourceColumnIndex].ToString());//give coluns name of source table rather then destination table so that it would avoid case sensitivity
                            }

                        }
                        bulkCopy.WriteToServer(destinationTable);
                        bulkCopy.Close();
于 2016-08-19T11:55:02.660 に答える
2

マークによる答えは、私の推奨事項です(ステージングテーブルの使用について)。これにより、ソースが変更されない場合、将来のインポートの問題が少なくなります。

ただし、私の経験では、次の問題を確認できます。

ソースとテーブルで列名が一致していること 列の型が一致していること

あなたがこれをやったと思うなら、まだ成功していません。以下を試すことができます。

1 - テーブル内のすべての列で null を許可します 2 - すべての列マッピングをコメントアウトします 3 - 問題がどこにあるかがわかるまで、一度に 1 列ずつ追加していきます

それはバグを引き起こすはずです

于 2009-01-14T01:56:23.360 に答える
0

私が見つけたのは、テーブルの列と入力の列が少なくとも一致する必要があるということです。テーブルにさらに列を含めることができ、入力は引き続きロードされます。少ない場合は、エラーが発生します。

于 2009-10-26T17:00:04.567 に答える
0

回答について長い間考えました...列名の大文字と小文字が同じであっても、データ型が異なると同じエラーが発生します。したがって、列名とそのデータ型を確認してください。

PS: ステージング テーブルは、インポートする決定的な方法です。

于 2015-08-25T19:45:58.493 に答える