Sono in procinto di convertire alcune routine di reporting basate su stored procedure da eseguire in C#. L'idea generale è quella di utilizzare tutte le meraviglie di C# /. NET Framework e quindi restituire i risultati nel DB. Tutto è andato a gonfie vele, tranne per un problema che ho incontrato ieri e risolto oggi.Ottenere SqlBulkCopy per onorare i nomi delle colonne
Per eseguire l'importazione, sto creando un DataTable al livello di programmazione e utilizzando SqlBulkCopy per spostare i risultati sul server.
ad es.
DataTable detail = new DataTable();
detail.Columns.Add(new DataColumn("Stock", Type.GetType("System.Decimal")));
detail.Columns.Add(new DataColumn("Receipts", Type.GetType("System.Decimal")));
detail.Columns.Add(new DataColumn("Orders", Type.GetType("System.Decimal")));
La tabella di importazione contiene i campi nel seguente ordine.
...
Stock decimal(18,4),
Orders decimal(18,4),
Receipts decimal(18,4)
...
In sostanza, il valore per Receipts stava entrando in ordini e viceversa.
Evidentemente, questo è dovuto al fatto che SqlBulkCopy non sembra rispettare il nome della colonna che gli ho detto di compilare, ma solo per posizione ordinale.
Questo è un problema per me poiché utilizziamo il confronto SQL di Redgate. Quando si spostano le modifiche da un database a un altro, la posizione ordinale delle colonne non viene necessariamente mantenuta. Ad esempio, se si inserisce una nuova colonna come terzo campo ordinale, SQL Compare lo aggiungerà alla tabella solo su una sincronizzazione, rendendola l'ultima colonna.
Questo compromette seriamente la mia soluzione. Ora, queste sono solo tabelle di "importazione", quindi se necessario, posso rilasciarle e ricrearle come parte di qualsiasi script di migrazione con le posizioni ordinali intatte. Preferirei non farlo comunque.
C'è un modo per forzare SqlBulkCopy ad onorare i nomi delle colonne che gli dici di riempire?
P.S., c'è un'opzione di progetto in Red Gate SQL Compare denominata "Ordine colonna forzata" che manterrà l'ordine delle colonne lo stesso durante le sincronizzazioni di nuove colonne. (Intendiamoci, questo richiede una goccia e la ricostruzione del tavolo, ma ha funzionato bene per me in passato quando assolutamente necessario.) – Funka