2013-11-26 2 views
5

nie wiem dlaczego jestem coraz wyżej wyjątek, proszę ktoś spojrzeć na to ....Podana ColumnMapping nie zgadza się z dowolnej kolumny w źródle lub przeznaczenia

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

Miałem ten sam problem. W moim przypadku jedna z właściwości klasy nie zawierała odpowiedniej kolumny w tabeli i nie została oznaczona jako zignorowana. Po dodaniu kolumny błąd zniknął. Mam nadzieję, że to uratuje czyjś czas. –

+0

Czy istnieje sposób na uzyskanie konkretnego mapowania, na które narzeka? –

Odpowiedz

3

Problem jest z s.ColumnMappings.Add(column.ToString(), column.ToString()); i mapowanie miejsc docelowych i tabel źródłowych. Co najmniej jedna z kolumn w tabeli DataTable nie pasuje do tabeli docelowej.

Istnieje wiele powodów, ale jednym z nich może być niedopasowanie typów danych. Więc jeśli spróbujesz wstawić tekst do kolumny całkowitej.

11

Należy pamiętać, że w kolumnach sqlBulkCopy rozróżniana jest wielkość liter w niektórych wersjach SQL. Myślę, że MSSQL 2005. Mam nadzieję, że pomaga

6

Jednym z powodów jest to, że: SqlBukCOpy jest rozróżniana wielkość liter. Wykonaj kroki:

  1. W takim przypadku najpierw trzeba znaleźć swoją kolumnę w źródle tabeli za pomocą „zawiera” metody w C#.
  2. Gdy kolumna docelowa zostanie dopasowana do kolumny źródłowej, pobierz indeks tej kolumny i podaj jej nazwę w SqlBukCOpy.

Na przykład: '

//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

Witam, czy istnieje sposób, w jaki możemy dodać nawiasy kwadratowe do dtSource.Columns, ponieważ mój datatable je zawiera ..ex: [Węzeł] .. stąd jego znalezienie indeksu z tego powodu ... proszę radzić – user1046415

+0

Nie używać nawiasy kwadratowe. To będzie koszmar w twojej bazie danych. Polecam wdrożenie metody znalezienia/zastąpienia lub wcześniejszego zatwierdzenia. –

0
  1. ZAPEWNIĆ dostarczenie ColumnMappings

  2. UPEWNIJ wszystkich wartości nazwa kolumny źródłowej są ważne i litery.

  3. ZAPEWNIĆ wszystkie wartości dla kolumny docelowej są poprawne i rozróżniane są małe i wielkie litery.

  4. MAKE przypadek źródło niewrażliwy

0

miałem ten sam błąd i okazało się, że byłem mapowania do kolumny, która nie istniała w mojej bazy docelowej. Upewnij się, że kolumny istnieją, jeśli chcesz je zamapować.

Powiązane problemy