sql >> データベース >  >> RDS >> Sqlserver

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

    この投稿が古いことは知っていますが、同じ問題に遭遇し、最終的にどの列が問題を引き起こしているかを特定し、必要に応じて報告する解決策を見つけました。 colid と判断しました SqlException で返される値はゼロベースではないため、値を取得するにはそこから 1 を引く必要があります。その後、_sortedColumnMappings のインデックスとして使用されます SqlBulkCopy インスタンスの ArrayList は、SqlBulkCopy インスタンスに追加された列マッピングのインデックスではありません。注意すべきことの 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;
    }


    1. VARCHAR2列のResultSet.getString()は空の文字列を返します

    2. oracle10g休止状態の問題

    3. 私のDBAは病気です-SysAdminsのためのデータベースフェイルオーバーのヒント

    4. UTC時間からMySQLでUnixタイムスタンプを取得するにはどうすればよいですか?