SqlBulkCopy no funciona

asp.net c# sqlbulkcopy

Pregunta

Tengo un DataSet poblada de la hoja de Excel. Quería utilizar SQLBulk de copia para insertar registros en Lead_Hdr mesa donde LeadId es PK.

Estoy teniendo el siguiente error al ejecutar el siguiente código:

El ColumnMapping dado no coincide con ninguna columna en el origen o destino

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

Respuesta aceptada

Bueno, ¿está bien? ¿Los nombres de las columnas existen en ambos lados?

Para ser honesto, nunca me he molestado en hacer mapeos. Me gusta mantener las cosas simples: tiendo a tener una tabla de preparación que se parece a la entrada en el servidor, luego SqlBulkCopy en la tabla de preparación y finalmente ejecuto un procedimiento almacenado para mover la tabla de la tabla de preparación a la tabla real; ventajas:

  • no hay problemas con la corrupción de datos en vivo si la importación falla en cualquier momento
  • Puedo poner una transacción alrededor del SPROC
  • Puedo hacer que el bcp funcione sin iniciar sesión, con la certeza de que SPROC se registrará
  • es simple ;-p (no meterse con mapeos)

Como idea final, si está tratando con datos en masa, puede obtener un mejor rendimiento utilizando IDataReader (ya que se trata de una API de transmisión continua, donde, como DataTable es una API almacenada en búfer). Por ejemplo, tiendo a enganchar las importaciones de CSV usando CsvReader como la fuente de una copia del SqlBulk. Alternativamente, he escrito XmlReader alrededor de XmlReader para presentar cada elemento de primer nivel como una fila en un IDataReader - muy rápido.


Respuesta popular

He encontrado el mismo problema al copiar datos desde el acceso a SQLSERVER 2005 y descubrí que las asignaciones de columnas distinguen entre mayúsculas y minúsculas en ambas fuentes de datos, independientemente de la sensibilidad de las bases de datos.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué