C#からSQL Serverネイティブファイルを作成することは可能ですか(BCPネイティブ形式など)
-
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);