1

角かっこでスペースを含む列名をラップする必要があることはわかっています[]。これは、コラムを作成するときに行いDataTableます。

for (int i = 0; i < columns.Count; i++)
{
   string colname = columns[i].ToString();

   if (colname.Contains(" "))
   {
      colname = "[" + colname + "]";
   }

   dt.Columns.Add(colname);
}

次に、すべてのデータを行として my に追加したらDataTable、次のコードを使用して列をマップする挿入関数を呼び出します。DataTable列名は、とデータベース テーブルの両方で同じです。

using (var connection = new SqlConnection(ConnectionString))
{
    SqlTransaction transaction = null;
    connection.Open();

    try
    {
        transaction = connection.BeginTransaction();

        using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction))
        {
            sqlBulkCopy.DestinationTableName = "DBTableName";

            foreach (DataColumn col in dataTable.Columns)
            {
                sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
            }

            sqlBulkCopy.WriteToServer(dataTable);
        }

        transaction.Commit();
    }
    catch (Exception)
    {
        transaction.Rollback();
    }
}

実行中にブレークポイントを設定すると、スペースを含む名前の周りに角括弧が正しく含まれますColumnMappingcol.ColumName

ただし、メソッドを呼び出そうとするWriteToServerと失敗し、例外が表示されます

指定された ColumnName 'Name With Space' は、データ ソース内のどの列とも一致しません。

なぜ/どこで角かっこが取り除かれていますか? また、この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

これがヒットしている.netまたはsqlサーバーのバージョンと関係があるかどうかはわかりませんが、間違っていたため、列名の周りに角括弧を追加する必要はありませんでした. とにかく、それらのスペースを正しく処理します。

于 2015-12-11T19:50:34.157 に答える
0

すべての列を挿入する場合は、マッピングは必要ありません。これを削除できます:

    foreach (DataColumn col in dataTable.Columns)
    {
            sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
    }
于 2015-12-08T21:01:10.963 に答える