sql >> Database teknologi >  >> RDS >> Sqlserver

Modtog en ugyldig kolonnelængde fra bcp-klienten for colid 6

Jeg ved, at dette indlæg er gammelt, men jeg løb ind i det samme problem og fandt endelig ud af en løsning for at bestemme, hvilken kolonne der forårsagede problemet og rapportere det tilbage efter behov. Jeg fandt ud af, at colid returneret i SqlException er ikke nul baseret, så du skal trække 1 fra det for at få værdien. Derefter bruges det som indeks for _sortedColumnMappings ArrayList for SqlBulkCopy-forekomsten ikke indekset for kolonnetilknytningerne, der blev tilføjet til SqlBulkCopy-forekomsten. En ting at bemærke er, at SqlBulkCopy stopper ved den første fejl, der modtages, så dette er muligvis ikke det eneste problem, men hjælper i det mindste med at finde ud af det.

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. Lagrede procedurer ved hjælp af MySQL Workbench

  2. SQL Trigger kan ikke gøre I STEDET FOR SLET, men er påkrævet for ntext, billedkolonner

  3. Oracle View vs sammenføjning af tabeller i Oracle

  4. Laravel:Hvordan gemmer jeg data i json-format i databasen?