1

検索しようとしましたが、比較的単純なことに対する答えが見つかりませんでした。データベーステーブルのようにすべての列を持たない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");
    }
}
4

2 に答える 2

1

CSV の結果をステージング SQL テーブルにダンプし、ステージング テーブルから本番テーブルに単純な挿入を行います。

CSV を SQL テーブルに簡単にインポートすることもできます。CSV ファイル内に空または無効な列がいくつかある可能性があります。

于 2013-07-10T06:22:31.703 に答える