È possibile creare un file nativo di SQL Server da c # (come il formato nativo BCP)

StackOverflow https://stackoverflow.com/questions/1810796

  •  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?

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top