2013-11-26 9 views
5

io non so perché io sono sempre l'eccezione di cui sopra, per favore qualcuno guardarlo ....La data ColumnMapping non corrisponde a nessuna colonna nella origine o di destinazione

DataTable DataTable_Time = new DataTable("Star_Schema__Dimension_Time"); 

DataColumn Sowing_Day = new DataColumn(); 
Sowing_Day.ColumnName = "Sowing_Day"; 

DataColumn Sowing_Month= new DataColumn(); 
Sowing_Month.ColumnName = "Sowing_Month";  

DataColumn Sowing_Year = new DataColumn(); 
Sowing_Year.ColumnName = "Sowing_Year"; 

DataColumn Visit_Day= new DataColumn(); 
Visit_Day.ColumnName = "Visit_Day"; 

DataColumn Visit_Month = new DataColumn(); 
Visit_Month.ColumnName = "Visit_Month"; 

DataColumn Visit_Year = new DataColumn(); 
Visit_Year.ColumnName = "Visit_Year"; 

DataColumn Pesticide_spray_day = new DataColumn(); 
Pesticide_spray_day.ColumnName = "Pesticide_spray_day"; 

DataColumn Pesticide_spray_Month = new DataColumn(); 
Pesticide_spray_Month.ColumnName = "Pesticide_spray_Month"; 

DataColumn Pesticide_spray_Year = new DataColumn(); 
Pesticide_spray_Year.ColumnName = "Pesticide_spray_Year"; 

DataTable_Time.Columns.Add(Pesticide_spray_Year); 
DataTable_Time.Columns.Add(Sowing_Day); 
DataTable_Time.Columns.Add(Sowing_Month); 
DataTable_Time.Columns.Add(Sowing_Year); 
DataTable_Time.Columns.Add(Visit_Day); 
DataTable_Time.Columns.Add(Visit_Month); 
DataTable_Time.Columns.Add(Visit_Year); 
DataTable_Time.Columns.Add(Pesticide_spray_day); 
DataTable_Time.Columns.Add(Pesticide_spray_Month); 

adapter.SelectCommand = new SqlCommand(
    "SELECT SowingDate,VisitDate,PesticideSprayDate " + 
    "FROM Transformed_Table " + 
    "group by SowingDate,VisitDate,PesticideSprayDate", con); 

adapter.SelectCommand.CommandTimeout = 1000; 

adapter.Fill(DataSet_DistinctRows, "Star_Schema__Dimension_Time"); 

DataTable_DistinctRows = DataSet_DistinctRows.Tables["Star_Schema__Dimension_Time"]; 

int row_number = 0; 
int i = 3; 

foreach(DataRow row in DataTable_DistinctRows.Rows) 
{ 
    DataRow flatTableRow = DataTable_Time.NewRow(); 

    string[] Sarray= Regex.Split(row[0].ToString()," ",RegexOptions.IgnoreCase); 
    string[] finalsplit = Regex.Split(Sarray[0], "/", RegexOptions.IgnoreCase); 
    string[] Sarray1 = Regex.Split(row[1].ToString(), " ", RegexOptions.IgnoreCase); 
    string[] finalsplit2 = Regex.Split(Sarray1[0], "/", RegexOptions.IgnoreCase); 
    string[] Sarray2= Regex.Split(row[2].ToString(), " ", RegexOptions.IgnoreCase); 
    string[] finalsplit3 = Regex.Split(Sarray2[0], "/", RegexOptions.IgnoreCase);    

    flatTableRow["Sowing_Day"] = int.Parse(finalsplit[0]); 
    flatTableRow["Sowing_Month"] = int.Parse(finalsplit[0]); 
    flatTableRow["Sowing_Year"] = int.Parse(finalsplit[0]); 

    flatTableRow["Visit_Day"] = int.Parse(finalsplit2[0]); 
    flatTableRow["Visit_Month"] = int.Parse(finalsplit2[0]); 
    flatTableRow["Visit_Year"] = int.Parse(finalsplit2[0]); 

    flatTableRow["Pesticide_spray_day"] = int.Parse(finalsplit3[0]); 
    flatTableRow["Pesticide_spray_Month"] = int.Parse(finalsplit3[0]); 
    flatTableRow["Pesticide_spray_Year"] = int.Parse(finalsplit3[0]); 

    DataTable_Time.Rows.Add(flatTableRow); 

    i++; 
} 

con.Open(); 

using (SqlBulkCopy s = new SqlBulkCopy(con)) 
{ 
    s.DestinationTableName = DataTable_Time.TableName; 

    foreach (var column in DataTable_Time.Columns) 
     s.ColumnMappings.Add(column.ToString(), column.ToString()); 

    s.BulkCopyTimeout = 500; 

    s.WriteToServer(DataTable_Time); 
} 
+0

Ho avuto lo stesso problema. Nel mio caso, una delle proprietà della classe non aveva una colonna corrispondente nella tabella e non era contrassegnata come ignorata. Una volta aggiunta la colonna, l'errore era scomparso. Spero che questo salvi il tempo di qualcuno. –

+0

C'è un modo per ottenere la mappatura specifica di cui si lamenta? –

risposta

3

Il problema è con il s.ColumnMappings.Add(column.ToString(), column.ToString()); e mappatura delle tabelle di destinazione e origine. Almeno una delle colonne nel tuo DataTable non corrisponde alla tabella di destinazione.

Ci sono molti motivi, ma uno di questi può essere un disadattamento del tipo di dati. Quindi, se provi ad inserire del testo in una colonna intera.

11

È importante tenere presente che le colonne sqlBulkCopy sono case sensitive per alcune versioni di SQL. Penso che MSSQL 2005. Spero che lo aiuti

6

Uno dei motivi è che: SqlBukCOpy è case sensitive. Seguire i passaggi:

  1. in quel caso prima si devono trovare la colonna nell'origine tabella utilizzando "contenere" il metodo in C#.
  2. Una volta che la colonna di destinazione corrisponde alla colonna di origine, ottenere l'indice della colonna e fornire il nome della colonna in SqlBukCOpy.

Per esempio: `

//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(); 
+0

Salve, c'è un modo in cui possiamo aggiungere parentesi quadre al dtSource.Columns, dato che il mio datatable li contiene ..ex: [Nodo] .. quindi non trova l'indice a causa di questo..considerare – user1046415

+0

Non usare parentesi quadre. Sarà un incubo nel tuo database. Consiglierei di implementare un metodo per trovarli/sostituirli o aggiungere in anticipo alcune convalide. –

0
  1. GARANTIRE per fornire un ColumnMappings

  2. GARANTIRE tutti i valori per sorgente nome di colonna sono validi e minuscole.

  3. ENSURE tutti i valori per il nome della colonna di destinazione sono validi e case sensitive.

  4. FARE caso fonte insensitive

0

Ho avuto questo stesso errore e si è rivelato essere il fatto che io ero la mappatura a una colonna che non esisteva nel mio database di destinazione. Assicurati che le tue colonne esistano se hai intenzione di mapparle.