当前位置:  开发笔记 > 编程语言 > 正文

SqlBulkCopy无效

如何解决《SqlBulkCopy无效》经验,为你挑选了2个好方法。

我有DataSetExcel表格填充.我想使用SQLBulk Copy在Lead_Hdr表中插入记录LeadIdPK.

我在执行以下代码时遇到以下错误:

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

Tareq.. 40

从访问SQLSERVER 2005复制数据时遇到了同样的问题,我发现无论数据库的敏感性如何,列映射都对两个数据源都区分大小写.



1> Tareq..:

从访问SQLSERVER 2005复制数据时遇到了同样的问题,我发现无论数据库的敏感性如何,列映射都对两个数据源都区分大小写.


我正在使用SQL SERVER 2008 R2.这仍然是一个问题.因此,在Sql 2008中,列显然仍然区分大小写(在2013年).我还将我的sql server 2008 R2更新为最新的服务包等.
与Marc的反馈一样,这应该是公认的答案,因为区分大小写可能是此错误的最常见原因(请参阅与SqlBulkCopy类相关的所有stackoverflow问题).问题不在于任何版本的SQL Server,因为SQL Server不关心列大小写,它的SqlBulkCopy .NET类强制区分大小写,并且此类应具有禁用区分大小写的属性.

2> Marc Gravell..:

好吧,是吗?列名是否存在于双方?

说实话,我从不打扰过映射.我喜欢保持简单 - 我倾向于有一个临时表,看起来像服务器上的输入,然后我SqlBulkCopy进入临时表,最后运行存储过程将表从临时表移动到实际表中; 好处:

如果导入在任何时候失败,则不会出现实时数据损坏问题

我可以在SPROC附近进行交易

我可以让bcp在没有记录的情况下工作,在知道SPROC将被记录的情况下是安全的

它很简单;-p(没有乱码)

最后的想法 - 如果您正在处理批量数据,您可以使用更好的吞吐量IDataReader(因为这是一个流API,其中 - 作为DataTable缓冲API).例如,我倾向于使用CsvReader作为SqlBulkCopy的源来挂起CSV导入.或者,我已经写了一些垫片XmlReader来将每个第一级元素呈现为一行IDataReader- 非常快.


登台表是您将数据转储到的表.通常,它没有索引,因此写入速度更快.转储到临时表,操作数据,并使用存储过程从暂存写入生产表(将其包装在事务中以防止损坏).
请记住,临时表数据是暂时的,因此在将数据放入之前要清除它,并且除了将数据转换为输出到另一组表之外,不要使用它来检索数据.此外,请记住,分阶段数据往往不如"真实"数据正常.
嗯,我是这个"分期"术语的新手,请你解释一下
推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有