È possibile eseguire la conversione del tipo di dati su SQLBulkUpload da IDataReader?

c#-4.0 mapping sqlbulkcopy

Domanda

Ho bisogno di prendere una grande quantità di dati da un set di tabelle e SQLBulkInsert in un altro set ... sfortunatamente le tabelle di origine sono TUTTE varchar (max) e vorrei che la destinazione fosse del tipo corretto. Alcuni tavoli si trovano in milioni di righe ... e (per motivi di policialità troppo inutili per entrare) non possiamo usare SSIS.

Oltre a ciò, alcuni valori "bool" sono memorizzati come "Y / N", alcuni "0/1", alcuni "T / F" alcuni "true / false" e infine alcuni "on / off".

C'è un modo per sovraccaricare IDataReader per eseguire la conversione dei tipi? Dovrebbe essere su base per colonna, suppongo?

Un'alternativa (e potrebbe essere la soluzione migliore) è mettere un mapper in posizione (forse AutoMapper o personalizzato) e usare EF per caricare da un oggetto e mappare nell'altro? Ciò provocherebbe molto controllo, ma richiede anche molto codice di codice per ogni proprietà :(

Risposta accettata

Alla fine ho scritto una classe wrapper di base per contenere SQLDataReader e implementando i metodi IDataReader solo per chiamare il metodo SQLDataReader.

Quindi eredita dalla classe base e sostituisci GetValue in base al singolo caso, cercando i nomi delle colonne che devono essere tradotti:

public override object GetValue(int i)
{
  var landingColumn = GetName(i);
  string landingValue = base.GetValue(i).ToString();

  object stagingValue = null;
  switch (landingColumn)
    {
    case "D4DTE": stagingValue = landingValue.FromStringDate(); break;
    case "D4BRAR": stagingValue = landingValue.ToDecimal(); break;

    default:
        stagingValue = landingValue;
        break;
    }
  return stagingValue;
}

Funziona bene, è estensibile e molto veloce grazie a SQLBulkUpload. OK, quindi c'è un piccolo sovraccarico di manutenzione, ma dato che le colonne di origine cambieranno molto raramente, questo non ha alcun effetto su nulla.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché