¿Es posible crear un archivo nativo de SQL Server desde c # (como el formato nativo BCP)?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Estamos actualizando una base de código de 15 años, hay un requisito para crear algunos archivos de datos con formato BCP nativo.

En el nuevo sistema, lo ideal sería utilizar datos en un objeto C # DataTable para crear el archivo de datos en formato BCP nativo.

¿Se puede hacer esto y, de ser así, cuál sería el mejor enfoque?

¿Fue útil?

Solución

No, no se puede hacer, la única forma que hemos descubierto para crear archivos BCP nativos es mediante el uso de SQL Server. Si alguien se desarrolla o encuentra otra manera, por favor publíquelo aquí

Otros consejos

Si es tan viejo, entonces la pieza BCP puede parecerse mucho a una pieza BCP de Sybase. En Sybase, comencé a buscar en las bibliotecas de los clientes y se enviaron ejemplos de código utilizando la API de BCP. CTLib y / o jars para la API correspondiente. Para Microsoft podría haber partes similares de C nativa o API básica que involucren a BCP. Es posible que no necesite la parte de comunicación de la API, solo la preparación de registro por registro y las lecturas / escrituras en el archivo.

Si no existe tal cosa, entonces consideraría un formato no nativo con archivos FMT hechos a mano y archivos de datos tipo texto, producidos / consumidos por el programa BCP original.

Hay una forma similar de hacerlo, pero tiene que hacer referencia a SQLDMO y creará un formato equivalente al igual que BCP. Al utilizar el objeto BulkCopy de SQLDMO, puede hacer lo que está buscando. Aquí hay un enlace a la rutina realizada en vbscript que usa la biblioteca SQLDMO aquí .

Espero que esto ayude, Atentamente, Tom.

¿Puede colocar los datos en la base de datos en un área de ensayo en un servidor SQL? Si es así, puedes generar un proceso BCP.

BCP: http://msdn.microsoft .com / en-us / library / aa174646% 28SQL.80% 29.aspx

Por ejemplo, yo uso:

BCP Database.Schema.TableName OUT FileName.Ext -S ServerName -T -n

Interruptores:

  • -S es para el servidor
  • -T es para una conexión de confianza
  • -n es para formato nativo

EDITAR + Nueva idea:

Si tiene acceso a las consultas que llenan los datos, puede usarlos con BCP o SQLDMO para exportar un archivo de formato nativo. Las siguientes consultas utilizan el conmutador QUERYOUT en lugar del conmutador OUT porque contienen consultas en línea

Exportar columnas específicas desde una vista:

BCP "SELECT Column1, Column2 FROM MyViewName" QUERYOUT FileName.Ext -S ServerName -T -n

Exportar columnas específicas desde 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

asumiendo que solo tiene arreglos con los tipos de columna en la tabla de destino, sin posibilidad de nulos, sin cadenas Unicode, y que está dispuesto a manejar la endiancia, el formato de archivo nativo es solo los bytes de los tipos.

Recientemente, realicé datos de forma masiva desde un script c # escribiendo un byte by byte y utilizando BCP

bcp destTable in model.raw -T -S _serverName -n

model.raw se crea byte-by by

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top