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

C# 给定的ColumnMapping与源或目标中的任何列都不匹配,c#,sqlbulkcopy,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 = "Sow

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

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);
}
问题在于s.ColumnMappings.Addcolumn.ToString、column.ToString;以及目标表和源表的映射。DataTable中至少有一列与目标表不匹配


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

请记住,对于某些版本的SQL,sqlBulkCopy列是区分大小写的。我想是2005年。 希望它能有所帮助一个原因是SqlBulkCopy区分大小写。 遵循以下步骤:

使用C中的Contains方法在源表中查找您的列。 目标列与源列匹配后,获取该列的索引并将其名称命名为SqlBulkCopy。 例如:

//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();
确保提供列映射

确保源列名的所有值都有效且区分大小写

确保目标列名的所有值都有效且区分大小写

使源代码不区分大小写


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

在我的例子中,我向列映射添加了两次列。我删除了副本,一切正常。

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

我也面临同样的问题。 在我的例子中,我得到的是从seriLog生成的Logs表,它缺少表创建中的附加列,这导致了上述错误


一旦我自己用所需的附加列创建了logs表,这个错误就消失了。

除了上面各种答案中提到的区分大小写之外。检查您是否有相同的列,并且您没有偶然错过任何列。这件事发生在我的一位同事身上,他在87栏中漏掉了一栏。因此,只需再次检查目标中源中的每一列。

在我的情况下,连接字符串中的Initial Catalog=中的数据库名称是错误的。

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

我也遇到了同样的问题。在我的例子中,该类的一个属性在表中没有对应的列,并且没有标记为忽略。一旦我添加了列,错误就消失了。我希望这能节省一些人的时间。有没有办法获得它抱怨的特定映射?嗨,我们有没有办法在dtSource.Columns中添加方括号,因为我的数据表中包含它们..ex:[节点]。。因此,找不到索引是因为……请不要使用方括号。这将是你数据库中的一场噩梦。我建议实现一个方法来查找/替换它们,或者预先添加一些验证。您应该属性:如果您没有演示如何执行这些步骤,则列出这些步骤并不是特别有用。回答得很好。谢谢,先生。你救了我一天!节省了我很多时间。我使用的是Sql Server 2012,它对大小写敏感,所以我假设所有版本都区分大小写。这为我解决了这个问题。映射是正确的,但正在记住旧映射。实例化了一个新的BCP,它成功了,谢谢。