È possibile creare un file nativo di SQL Server da c # (come il formato nativo BCP)
-
05-07-2019 - |
Domanda
Stiamo aggiornando una base di codice di 15 anni, è necessario creare alcuni file di dati in formato BCP nativi.
Nel nuovo sistema, vorremmo idealmente utilizzare i dati in un oggetto DataTable C # per creare il file di dati in formato BCP nativo.
È possibile farlo e, in tal caso, quale sarebbe l'approccio migliore?
Soluzione
No, non è possibile, l'unico modo che abbiamo scoperto per creare file BCP nativi è utilizzando SQL Server. Se qualcuno sviluppa o trova un altro modo, pubblicalo qui!
Altri suggerimenti
Se è così vecchio, allora un pezzo BCP potrebbe assomigliare molto a un pezzo BCP Sybase. In Sybase inizierei a esaminare le librerie client e fornivo esempi di codice usando l'API BCP. Vasetti CTLib e / o Java per l'API corrispondente. Per Microsoft potrebbero esserci parti simili di C nativa o API di base che coinvolgono BCP. Potrebbe non essere necessaria la parte di comunicazione dell'API, solo preparazione record per record e lettura / scrittura su file.
Se non esiste nulla del genere, prenderei in considerazione il formato non nativo con file FMT fatti a mano e file di dati simili a testo, prodotti / consumati dal programma BCP originale.
Esiste un modo simile per farlo, ma devi fare riferimento a SQLDMO e creerà un formato equivalente proprio come BCP. Usando l'oggetto BulkCopy di SQLDMO, puoi fare quello che stai cercando. Ecco un link alla routine eseguita in vbscript che utilizza la libreria SQLDMO qui .
Spero che questo aiuti, I migliori saluti, Tom.
Sei in grado di inserire i dati nel datatable in un'area di gestione temporanea su un server SQL? In tal caso, puoi generare un processo BCP.
BCP: http://msdn.microsoft .com / it-it / library / aa174646% 28SQL.80% 29.aspx
Ad esempio, io uso:
BCP Database.Schema.TableName OUT FileName.Ext -S ServerName -T -n
Interruttori:
- -S è per il server
- -T è per connessione attendibile
- -n è per il formato nativo
MODIFICA + Nuova idea:
Se si ha accesso alle query che riempiono il datatable, è possibile utilizzare quelle con BCP o SQLDMO per esportare un file in formato nativo. Le seguenti query utilizzano l'opzione QUERYOUT anziché l'opzione OUT perché contengono query incorporate
Esporta colonne specifiche da una vista:
BCP "SELECT Column1, Column2 FROM MyViewName" QUERYOUT FileName.Ext -S ServerName -T -n
Esporta colonne specifiche da un JOIN:
BCP "SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 on Table1.Column33 = Table2.Column33" QUERYOUT FileName.Ext -S ServerName -T -n
supponendo che tu abbia risolto solo con i tipi di colonna nella tabella di destinazione, niente nullable, nessuna stringa unicode e sei disposto a gestire endian-ness, quindi il formato del file nativo è solo i byte dei tipi.
Recentemente ho fatto il bulk dei dati importati da uno script c # scrivendo un file di staging byte per byte e usando BCP
bcp destTable in model.raw -T -S _serverName -n
model.raw è stato creato byte-saggio da:
fileBytes = new byte[theLength * 4]; // * 4 bytes per element for int and float
var offset =0;
foreach (var element in outputDimensions)
{
// fastCopy is a faster and "Unsafe" equivelent of BlockCopy , faster because it doesn't create an intermediate byte array.
//Buffer.BlockCopy(BitConverter.GetBytes(profileid), 0, fileBytes, offset, 4);
Utilities.fastCopy(profileid, fileBytes, offset);
offset += 4;
Utilities.fastCopy(element.index, fileBytes, offset);
offset += 4;
for (var i = 0; i < TimeSlices; i++, offset += 4)
{
float target = GetDataForTime(i,...);
Utilities.fastCopy(target, fileBytes, offset);
}
}
FileStream dataWriter.Write(fileBytes , 0, byteArray.Length);