给定的ColumnMapping与源或目标中的任何列都不匹配

时间:2013-11-26 21:30:00

标签: c# sqlbulkcopy

我不知道为什么我会得到上述异常,请有人看看....

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

11 个答案:

答案 0 :(得分:21)

重要的是要记住,对于某些版本的SQL,sqlBulkCopy列区分大小写。我觉得MSSQL 2005。 希望它有所帮助

答案 1 :(得分:12)

一个原因是SqlBulkCopy区分大小写。 按照步骤:

  1. 使用C#中的Contains方法在源表中查找列。
  2. 目标列与源列匹配后,获取该列的索引并将其名称指定给SqlBulkCopy
  3. 例如:

    //Get Column from Source table 
    string sourceTableQuery = "Select top 1 * from sourceTable";
    
    // i use sql helper for executing query you can use corde sw
    DataTable dtSource 
        = SQLHelper.SqlHelper
            .ExecuteDataset(transaction, CommandType.Text, sourceTableQuery)
            .Tables[0];
    
    for (int i = 0; i < destinationTable.Columns.Count; i++)
    {
        string destinationColumnName = destinationTable.Columns[i].ToString();
    
        // check if destination column exists in source table 
        // Contains method is not case sensitive    
        if (dtSource.Columns.Contains(destinationColumnName))
        {
            //Once column matched get its index
            int sourceColumnIndex = dtSource.Columns.IndexOf(destinationColumnName);
    
            string sourceColumnName = dtSource.Columns[sourceColumnIndex].ToString();
    
            // give column name of source table rather then destination table 
            // so that it would avoid case sensitivity
            bulkCopy.ColumnMappings.Add(sourceColumnName, sourceColumnName);
        }                               
    }
    
    bulkCopy.WriteToServer(destinationTable);
    bulkCopy.Close();
    

答案 2 :(得分:3)

问题在于s.ColumnMappings.Add(column.ToString(), column.ToString());以及目标和源表的映射。 DataTable中至少有一列与目标表不匹配。

有很多原因,但其中一个可能是数据类型不匹配。因此,如果您尝试将文本插入整数列。

答案 3 :(得分:3)

  1. 确保提供ColumnMappings

  2. 确定源列名的所有值均有效且区分大小写。

  3. 确保目标列名称的所有值均有效且区分大小写。

  4. MAKE 源不区分大小写

答案 4 :(得分:1)

我遇到了同样的错误,结果发现我正在映射到目标数据库中不存在的列。如果要映射列,请确保列确实存在。

答案 5 :(得分:0)

就我而言,我在CREATE TABLE Car ( RegPlate int(8) NOT NULL PRIMARY KEY, Brand varchar(20) NOT NULL, Color varchar(20) NOT NULL, Owner int(10) NOT NULL, CONSTRAINT fk_car_owner FOREIGN KEY (Owner) REFERENCES driver(ID) ); 上添加了两次列。我删除了重复项,一切正常。

答案 6 :(得分:0)

对于其他具有相同错误的人(但在这种情况下不适用,因为SqlBulkCopy被更新了),另一个原因可能是如果您试图将SqlBulkCopy实例重用于多次操作,因为列映射将在每个操作之间保持不变。在这种情况下,请为每个需要不同列映射的操作实例化一个SqlBulkCopy的新实例。

答案 7 :(得分:0)

我也面临同样的问题。 就我而言,我是从seriLog生成的Logs表,但是缺少表创建中的其他列,这导致了上述错误。

一旦我自己创建了带有所需其他列的日志表,此错误就消失了。

答案 8 :(得分:0)

除了以上各种答案中提到的区分大小写之外。检查您是否确实有相同的列,并且没有偶然错过任何内容。这发生在我的一位同事身上,他错过了87列中的一列。 因此,只需仔细检查一下,您的目的地中还会包含来源中的每一列。

答案 9 :(得分:0)

就我而言,它是连接字符串中“ Initial Catalog =“中的数据库名称错误。

答案 10 :(得分:0)

我遇到了同样的错误。对我来说,我不小心将源数据表的2个不同列映射到目标数据库表中的同一列。