検索しようとしましたが、比較的単純なことに対する答えが見つかりませんでした。データベーステーブルのようにすべての列を持たないCSVがあります。また、CSVの自動インクリメント、主キーも欠落しています。
CSV を DataSet に読み込み、従来の SQLBulkCopy コードを実行して、データセットの最初のテーブルをデータベース テーブルに読み込むだけです。しかし、それは私に次のエラーを与えます:
The given ColumnMapping does not match up with any column in the source or destination.
バルクコピーの私のコードは
using (SqlBulkCopy blkcopy = new SqlBulkCopy(DBUtility.ConnectionString))
{
blkcopy.EnableStreaming = true;
blkcopy.DestinationTableName = "Project_" + this.ProjectID.ToString() + "_Data";
blkcopy.BatchSize = 100;
foreach (DataColumn c in ds.Tables[0].Columns)
{
blkcopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
}
blkcopy.WriteToServer(ds.Tables[0]);
blkcopy.Close();
}
テストにマッピングを追加しましたが、マッピング部分を削除しても違いはありません。列を順番に一致させようとするマッピングを削除すると、列の数が異なるため、データ型が一致せず、列の値が少なくなります。そうです、CSV の列名はテーブルの列名と一致し、同じケースです。
編集: マッピング コードを変更して、ライブ DB の列名を比較します。このために、単純に SQL Select クエリを実行してデータベース テーブルから 1 つのレコードを取得し、次の操作を行います。
foreach (DataColumn c in ds.Tables[0].Columns)
{
if (LiveDT.Columns.Contains(c.ColumnName))
{
blkcopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
}
else
{
log.WriteLine(c.ColumnName + " doesn't exists in final table");
}
}