Est-il possible de créer un fichier natif SQL Server à partir de c # (comme le format natif BCP)

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

  •  05-07-2019
  •  | 
  •  

Question

Nous mettons à niveau une base de code vieille de 15 ans. Il est nécessaire de créer des fichiers de données au format BCP natif.

Dans le nouveau système, nous aimerions idéalement utiliser les données d'un objet C # DataTable pour créer le fichier de données au format natif BCP.

Cela peut-il être fait et si oui, quelle serait la meilleure approche?

Était-ce utile?

La solution

Non, cela n’est pas possible. La seule façon de créer des fichiers BCP natifs consiste à utiliser SQL Server. Si quelqu'un développe ou trouve un autre moyen, postez-le ici!

Autres conseils

Si elle est aussi ancienne, la pièce BCP peut ressembler beaucoup à une pièce Sybase BCP. Dans Sybase, je commençais à regarder les bibliothèques clientes et les exemples de code fournis à l'aide de l'API BCP. Fichiers jar CTLib et / ou Java pour l’API correspondante. Pour Microsoft, il peut exister des parties similaires de l'API C ou Basic de base impliquant BCP. Vous n’avez peut-être pas besoin de la partie communication de l’API, il vous suffit de préparer, d’enregistrer et d’enregistrer et de lire / écrire dans un fichier.

S'il n'y a pas une telle chose, alors je considérerais un format non natif avec des fichiers FMT faits à la main et des fichiers de données de type texte, produits / utilisés par le programme BCP d'origine.

Il existe une méthode similaire pour le faire, mais vous devez faire référence à SQLDMO et il créera un format équivalent, tout comme BCP. En utilisant l'objet BulkCopy de SQLDMO, vous pouvez faire ce que vous recherchez. Voici un lien vers la routine effectuée dans vbscript qui utilise la bibliothèque SQLDMO ici .

J'espère que ça aide, Meilleures salutations, Tom.

Pouvez-vous placer les données de la datatable dans une zone de stockage intermédiaire sur un serveur SQL? Si tel est le cas, vous pouvez générer un processus de PCA.

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

Par exemple, j'utilise:

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

Commutateurs:

  • -S est pour le serveur
  • -T est pour une connexion sécurisée
  • -n est pour le format natif

MODIFIER + Nouvelle idée:

Si vous avez accès aux requêtes qui remplissent le poste de travail, vous pouvez utiliser celles avec BCP ou SQLDMO pour exporter un fichier au format natif. Les requêtes suivantes utilisent le commutateur QUERYOUT au lieu du commutateur OUT car elles contiennent des requêtes en ligne

Exporter des colonnes spécifiques d'une vue:

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

Exporter des colonnes spécifiques à partir d'une jointure:

BCP "SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 on Table1.Column33 = Table2.Column33" QUERYOUT FileName.Ext -S ServerName -T -n

En supposant que seuls les types de colonnes de la table de destination soient corrigés, que rien ne puisse être annulé, qu'il n'y ait pas de chaînes unicode et que vous êtes prêt à gérer l'endian-ness, le format de fichier natif est uniquement constitué des octets des types.

J'ai récemment regroupé les données importées à partir d'un script c # en écrivant un fichier intermédiaire, octet par octet, et en utilisant BCP

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

model.raw est créé par:

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top