C#からSQL Serverネイティブファイルを作成することは可能ですか(BCPネイティブ形式など)

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

  •  05-07-2019
  •  | 
  •  

質問

15年前のコードベースをアップグレードしています。ネイティブBCP形式のデータファイルを作成する必要があります。

新しいシステムでは、C#DataTableオブジェクトのデータを活用して、ネイティブBCP形式のデータファイルを作成するのが理想的です。

これを実行できますか?その場合、最善のアプローチは何ですか?

役に立ちましたか?

解決

いいえ、できません。ネイティブBCPファイルを作成するために発見した唯一の方法は、SQL Serverを使用することです。誰かが別の方法を開発または見つけた場合は、ここに投稿してください!

他のヒント

それが古い場合、BCPピースはSybase BCPピースに非常に似ているかもしれません。 Sybaseでは、クライアントライブラリと、BCP APIを使用したコードのサンプルを見始めました。 CTLibおよび/または対応するAPIのJava jar。 Microsoftの場合、BCPに関連するネイティブCまたは基本APIの同様の部分があるかもしれません。 APIの通信部分は必要なく、レコードごとの準備とファイルの読み取り/書き込みだけが必要です。

そのようなものがない場合は、オリジナルのBCPプログラムによって作成/消費される、手作りのFMTファイルとテキスト形式のデータファイルを使用した非ネイティブ形式を検討します。

これを行うための同様の方法がありますが、SQLDMOを参照する必要があり、BCPと同様の同等の形式が作成されます。 SQLDMOのBulkCopyオブジェクトを使用すると、探していることを実行できます。 SQLDMOライブラリこちらを使用するvbscriptで実行されるルーチンへのリンクを次に示します。

これが役立つことを願って、 宜しくお願いします、 トム。

データテーブルのデータをSQL Serverのステージング領域に配置できますか?その場合は、BCPプロセスから生成できます。

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

たとえば、次を使用します:

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

スイッチ:

  • -Sはサーバー用です
  • -Tは信頼できる接続用です
  • -nはネイティブ形式です

編集+新しいアイデア:

データテーブルを埋めるクエリにアクセスできる場合は、BCPまたはSQLDMOでクエリを使用して、ネイティブ形式のファイルをエクスポートできます。次のクエリでは、インラインクエリが含まれているため、OUTスイッチではなくQUERYOUTスイッチを使用しています

ビューから特定の列をエクスポートする:

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

JOINから特定の列をエクスポートします:

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

宛先テーブルの列タイプのみを修正し、nullを許可せず、Unicode文字列を使用せず、エンディアンネスを処理したいと仮定すると、ネイティブファイル形式はタイプのバイトのみです。

最近、バイト単位でステージングファイルを記述し、BCPを使用して、c#スクリプトからデータを一括インポートしました

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

model.rawは、バイト単位で作成されます:

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top