95

csvファイルデータをc#コードからSQL Server 2005に一括アップロードしたいのですが、以下のエラーが発生します-

colid6のbcpクライアントから無効な列長を受け取りました。

データベースサーバーへの一括コピー書き込み時

4

7 に答える 7

214

この投稿が古いことは知っていますが、同じ問題に遭遇し、最終的にどの列が問題を引き起こしているかを特定し、必要に応じて報告する解決策を見つけました。colidSqlException で返される値はゼロベースではないため、値を取得するにはそこから 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;
}
于 2013-10-31T17:02:42.623 に答える
72

Excel のデータ列の 1 つ (列 ID 6) に、データベースの datacolumn データ型の長さを超える 1 つ以上のセル データがあります。

エクセルでデータ確認。また、Excel のデータの形式がデータベース テーブル スキーマに準拠していることを確認します。

これを回避するには、データベース テーブルの文字列データ型のデータ長を超えてみてください。

お役に立てれば。

于 2012-05-04T05:15:11.503 に答える
4

SQL BulkCopy オプションを使用してデータベース テーブルに文字列を渡すときに、同様の問題に直面しました。私が渡していた文字列は3文字でしたが、宛先列の長さはvarchar(20). 関数を使用してDBに挿入する前に文字列をトリミングしてTrim()、問題が文字列のスペース(先頭と末尾)に起因するかどうかを確認しました。文字列をトリミングした後、正常に機能しました。

あなたが試すことができますtext.Trim()

于 2015-07-16T07:17:11.810 に答える