我有一个从Excel Sheet填充的DataSet。我想使用SQLBulk Copy在Lead_Hdr为PK的LeadId表中插入记录。

执行以下代码时出现以下错误:


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周围编写了垫片,以非常快速地将每个第一级元素显示为IDataReader中的一行。

    关于c# - SqlBulkCopy不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/438587/

    10-10 04:36