2013-11-26 1 views
5

Я не знаю, почему я получаю выше исключение, пожалуйста, кто-то смотреть на это ....Данный ColumnMapping не совпадает с какой-либо столбца в источнике или назначения

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

У меня была такая же проблема. В моем случае одно из свойств класса не имело соответствующего столбца в таблице, и оно не было отмечено как игнорируемое. Как только я добавил столбец, ошибка исчезла. Надеюсь, это спасет чье-то время. –

+0

Есть ли способ получить конкретное картографирование, на которое он жалуется? –

ответ

3

Проблема заключается с s.ColumnMappings.Add(column.ToString(), column.ToString()); и сопоставление целевых и исходных таблиц. По крайней мере, один из столбцов в вашем DataTable не соответствует таблице назначения.

Существует много причин, но один из них может быть несоответствием данных. Поэтому, если вы попытаетесь вставить текст в целочисленный столбец.

11

Важно помнить, что столбцы sqlBulkCopy чувствительны к регистру для некоторых версий SQL. Я думаю, MSSQL 2005. Надеюсь, это поможет

6

Одна из причин этого: SqlBukCOpy чувствителен к регистру. Последующие шаги:

  1. В этом случае сначала вы должны найти свой столбец в исходной таблице с помощью «Содержать» метод в C#.
  2. После того, как столбец «Место назначения», сопоставленный столбцу источника, получит индекс этого столбца и укажите его имя столбца в SqlBukCOpy.

Для примера: `

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

Привет, есть ли способ добавить квадратные фигурные скобки в dtSource.Columns, так как мой datatable содержит их .ex: [Узел] .. следовательно, он не находит индекс из-за этого..пожалуйста сообщите – user1046415

+0

Не используйте квадратные скобки. Это будет кошмар в вашей базе данных. Я бы рекомендовал внедрить метод, чтобы найти/заменить их или добавить некоторые проверки заранее. –

0
  1. ОБЕСПЕЧИТЬ обеспечить ColumnMappings

  2. все Убедитесь, что значения для имени столбца источника являются действительными и чувствительны к регистру.

  3. ENSURE все значения для имени столбца назначения действительны и учитывают регистр.

  4. MAKE источник регистронезависимы

0

Я имел такую ​​же ошибку, и оказалось, что я отображение в колонку, которая не существовала в моей базе данных назначения. Убедитесь, что ваши столбцы существуют, если вы собираетесь их отображать.