上記の例外が発生する理由がわかりません。誰か見てください。
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と思います。
1つの理由は、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 [〜#〜]ソース列名のすべての値は有効であり、大文字と小文字が区別されます。
[〜#〜] ensure [〜#〜]宛先列名のすべての値は有効であり、大文字と小文字が区別されます。
[〜#〜] make [〜#〜]大文字と小文字を区別しないソース
問題は、s.ColumnMappings.Add(column.ToString(), column.ToString());
および宛先テーブルとソーステーブルのマッピングにあります。 DataTableの少なくとも1つの列が宛先テーブルと一致しません。
多くの理由がありますが、その1つはデータ型の不一致です。したがって、整数列にテキストを挿入しようとすると。
これと同じエラーが発生し、宛先データベースに存在しない列にマッピングしていたことが判明しました。列をマップする場合は、列が存在することを確認してください。
私の場合、ColumnMappings
に列を2回追加しました。重複を削除し、すべてが正常に機能しました。
同じエラーを持つ他の人(ただし、この場合はSqlBulkCopy
が更新されるため適用されません)の別の原因として、複数の操作でSqlBulkCopy
インスタンスを再利用しようとしている場合があります。列マッピングは、操作から操作へと持続します。その場合、異なる列マッピングを必要とする操作ごとにSqlBulkCopy
の新しいインスタンスをインスタンス化します。