我不知道为什么会出现上述异常,请有人看一下....
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);
}
请务必记住,对于某些版本的 SQL,sqlBulkCopy 列区分大小写。我认为是 MSSQL 2005。 希望有帮助
原因之一是
SqlBulkCopy
区分大小写。
请按照步骤:
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();
ENSURE 提供 ColumnMappings
ENSURE 源列名称的所有值均有效且区分大小写。
确保目标列名称的所有值均有效且区分大小写。
MAKE源大小写不敏感
除了上面各个答案中提到的区分大小写之外。检查您是否确实具有相同的列,并且您没有偶然错过任何列。我的一位同事就遇到过这种情况,他缺少 87 列中的一列。 因此,只需仔细检查目的地中是否也有来自源的每一列。
对于有相同错误的其他人(但在这种情况下不适用,因为
SqlBulkCopy
已更新),另一个原因可能是如果您尝试重用 SqlBulkCopy
实例进行多个操作,因为列映射将持续存在从运营到运营。在这种情况下,为需要不同列映射的每个操作实例化 SqlBulkCopy
的新实例。
问题在于
s.ColumnMappings.Add(column.ToString(), column.ToString());
以及目标表和源表的映射。 DataTable 中至少有一列与目标表不匹配。
原因有很多,但其中之一可能是数据类型不匹配。因此,如果您尝试将文本插入整数列。
我遇到了同样的错误,结果是我映射到目标数据库中不存在的列。如果要映射它们,请确保您的列确实存在。
就我而言,我向
ColumnMappings
添加了两次列。我删除了重复的内容,一切正常。
我也面临同样的问题。 就我而言,我正在获取从 seriLog 生成的日志表,并且它在表创建中缺少附加列,这导致了上述错误。
一旦我自己创建了包含所需附加列的日志表,此错误就消失了。
就我而言,连接字符串中的“Initial Catalog=”中的数据库名称错误。
我遇到了同样的错误。对我来说,我不小心将源数据表中的 2 个不同列映射到目标数据库表中的同一列。
在我们的例子中,供应商在其 api 中将 json 元素的大小写从“locationID”更改为“locationId”。 我们只是简单地更改了数据库表中的列名(因为我们可以……不推荐)
在我的例子中,我将数据从 Excel 工作表复制到 SQL Server。
以上建议都不适合我。经过 1 小时的调试,结果发现我在 Excel 中的列名称后面有一个空格! 调试这个非常困难,因为看到 Excel 中的空间真的很难。