SqlBulkCopy無效

asp.net c# sqlbulkcopy

我有一個從Excel表填充的DataSet 。我想在LeadId為PK的Lead_Hdr表中使用SQLBulk Copy來插入記錄。

執行下面的代碼時出現以下錯誤:

給定的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();
}

一般承認的答案

好吧,是嗎?列名是否存在於雙方?

說實話,我從不打擾過映射。我喜歡保持簡單 - 我傾向於有一個看起來像服務器輸入的登台表,然後我將SqlBulkCopy放入登台表,最後運行一個存儲過程將表從登台表移動到實際表中;優點:

  • 如果導入在任何時候失敗,則不會出現實時數據損壞問題
  • 我可以在SPROC附近進行交易
  • 我可以讓bcp在沒有記錄的情況下工作,在知道SPROC將被記錄的情況下是安全的
  • 它很簡單;-p(沒有亂碼)

最後的想法 - 如果您正在處理批量數據,您可以使用IDataReader獲得更好的吞吐量(因為這是一個流API,其中 - DataTable是一個緩衝的API)。例如,我傾向於使用CsvReader作為SqlBulkCopy的源來掛起CSV導入。或者,我在XmlReader周圍編寫了一些XmlReader ,將每個第一級元素作為IDataReader的一行顯示 - 非常快。


熱門答案

我從訪問SQLSERVER 2005複製數據時遇到了同樣的問題,我發現無論數據庫的敏感性如何,列映射都對兩個數據源都區分大小寫。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因