Problema del valore dell'indice nell'implementazione di IDataReader

c# idatareader sqlbulkcopy

Domanda

Ho implementato una classe utilizzando IDataReader come parte di un progetto che utilizza SqlBulkCopy. Ho pubblicato alcuni dei codici rilevanti qui

public bool Read()
{
    var result = !fileStream.EndOfStream;
    if (result)
    {
        delimRow = fileStream.ReadLine();    
        splitRowValues = delimRow.Split(_delimiters);
        readRowCount++;
    }    
    return result;
}

private string[] Row
{
    get { return splitRowValues; }
}

public object GetValue(int i)
{
    return Row[i];
}

Snippet di codice che utilizza SqlBulkCopy e IDataReader

SqlBulkCopy bulkInsert = new SqlBulkCopy(Constants.DBConnection, SqlBulkCopyOptions.UseInternalTransaction);
bulkInsert.BatchSize = 500;
bulkInsert.DestinationTableName = Constants.DestinationTable;
bulkInsert.WriteToServer(reader);

Quando si esegue il metodo WriteToServer, ho notato che la prima chiamata a GetValue () inizia con il valore dell'indice come 1 e il valore finale dell'indice è uno in meno del numero di colonne. A causa di questo problema, il carico alla rinfusa finisce per saltare una colonna.

Non riesco a trovare il motivo per cui l'indice in GetValue () non assume valori da 1 al conteggio delle colonne. In realtà, il valore dovrebbe essere iniziato da 0 e passato a un numero inferiore al conteggio delle colonne. Per favore fatemi sapere se qualcuno mi aiuta a trovare la causa.

Risposta accettata

Non si specifica la mappatura. Quindi, per impostazione predefinita, SqlBulkCopy può tentare di eseguire l'automap da ordinale con il database.

Ad esempio, se la prima colonna nel database è una colonna Identity (che ha grandi probabilità di essere il caso), salterà l' index 0 e inizierà invece con l' index 1 .



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow