csvファイルデータをc#コードからSQL Server 2005に一括アップロードしたいのですが、以下のエラーが発生します-
colid6のbcpクライアントから無効な列長を受け取りました。
データベースサーバーへの一括コピー書き込み時
csvファイルデータをc#コードからSQL Server 2005に一括アップロードしたいのですが、以下のエラーが発生します-
colid6のbcpクライアントから無効な列長を受け取りました。
データベースサーバーへの一括コピー書き込み時
この投稿が古いことは知っていますが、同じ問題に遭遇し、最終的にどの列が問題を引き起こしているかを特定し、必要に応じて報告する解決策を見つけました。colid
SqlException で返される値はゼロベースではないため、値を取得するにはそこから 1 を引く必要があると判断しました。その後_sortedColumnMappings
、SqlBulkCopy インスタンスに追加された列マッピングのインデックスではなく、SqlBulkCopy インスタンスの ArrayList のインデックスとして使用されます。注意すべきことの 1 つは、SqlBulkCopy は最初に受信したエラーで停止するため、これが唯一の問題ではない可能性がありますが、少なくともそれを理解するのに役立ちます。
try
{
bulkCopy.WriteToServer(importTable);
sqlTran.Commit();
}
catch (SqlException ex)
{
if (ex.Message.Contains("Received an invalid column length from the bcp client for colid"))
{
string pattern = @"\d+";
Match match = Regex.Match(ex.Message.ToString(), pattern);
var index = Convert.ToInt32(match.Value) -1;
FieldInfo fi = typeof(SqlBulkCopy).GetField("_sortedColumnMappings", BindingFlags.NonPublic | BindingFlags.Instance);
var sortedColumns = fi.GetValue(bulkCopy);
var items = (Object[])sortedColumns.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sortedColumns);
FieldInfo itemdata = items[index].GetType().GetField("_metadata", BindingFlags.NonPublic | BindingFlags.Instance);
var metadata = itemdata.GetValue(items[index]);
var column = metadata.GetType().GetField("column", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
var length = metadata.GetType().GetField("length", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
throw new DataFormatException(String.Format("Column: {0} contains data with a length greater than: {1}", column, length));
}
throw;
}
Excel のデータ列の 1 つ (列 ID 6) に、データベースの datacolumn データ型の長さを超える 1 つ以上のセル データがあります。
エクセルでデータ確認。また、Excel のデータの形式がデータベース テーブル スキーマに準拠していることを確認します。
これを回避するには、データベース テーブルの文字列データ型のデータ長を超えてみてください。
お役に立てれば。
SQL BulkCopy オプションを使用してデータベース テーブルに文字列を渡すときに、同様の問題に直面しました。私が渡していた文字列は3文字でしたが、宛先列の長さはvarchar(20)
. 関数を使用してDBに挿入する前に文字列をトリミングしてTrim()
、問題が文字列のスペース(先頭と末尾)に起因するかどうかを確認しました。文字列をトリミングした後、正常に機能しました。
あなたが試すことができますtext.Trim()