5

現在、OleDBCommand.ExecuteNonQuery (繰り返し呼び出される) を使用して、ソース DataTable から一度に 350,000 行を dbase ファイル (*.dbf) に挿入しています。OleDbCommand オブジェクトと OleDbParameters を再利用して、insert ステートメントが呼び出されるたびに挿入される値を設定しています。現在、350,000 行を挿入するには、私のプログラムで約 45 分かかります。

これを行うより効率的な方法はありますか?SQL Server で使用される一括挿入オプションに似たものが Dbase (*.dbf) ファイルに存在しますか?

4

3 に答える 3

2

OleDB ドライバーを Jet から vfpoledb に変更することで問題を修正しました。これにより、合計時間が 40 分から 8 分に短縮されました。

vfpoledb ドライバーとマージ モジュールは、以下のリンクからダウンロードされました。

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e1a87d8f-2d58-491f-a0fa-95a3289c5fd4

ご協力いただきありがとうございます。

于 2011-03-27T12:06:09.407 に答える
1

他のフィードバックから、SQL Serverであるため、SQLServerには一括アップロード機能があります。

アップロードしようとしているファイルの名前を想定したストアドプロシージャを作成し、そこですべてを実行します。Foxproで説明したのと同様の方法で、インポートしようとしている列に一致する一時テーブル(データの事前入力を高速化するために必要な場合)を作成し、そこにインポートします。一時構造に入ると、必要なデータのクレンジングを実行できます。準備ができたら、一時インポートテーブルからの選択としてプライマリテーブルに挿入します。

于 2011-03-10T13:40:24.163 に答える
1

特定のテーブルの.dbfおよび.cdxファイル拡張子の場合、おそらくVisual FoxProテーブルであり、特に「dBase」ではありません。

この場合、VFPは「appendfrom」コマンドを許可し、次のようになります...

SomeFile.txtタイプcsvから(yourTable)追加を使用します

ただし、XLS、DELIMITEDなどの他のインポートファイル形式も受け入れられます。

その場合、VFPでは、実行するコマンドを表す文字列を作成して、通常のPRGのように実行できるExecScript()コマンドも使用できます。VFPコマンドライブラリのすべてが利用できるわけではありませんが、必要なものは十分にあります。VFP OleDbプロバイダーを使用する必要があります。既に行っているように、接続を確立してください。次に、次のようなスクリプトを作成します...

String script = "[USE YourTable SHARED] +chr(13)+chr(10)+ " 
    + "[APPEND FROM OtherTextSource TYPE CSV]";

次に、発行します

YourConnection.ExecuteNonQuery( "ExecScript( " + script + " ) " );

着信ソースの構造が予想されるテーブルと同じでない場合は、入力ソースと一致する順序で列を含む一時テーブル(VFPのカーソル)を作成することもできますが、列名とデータ型は同じです。それらが引き込まれるFINALテーブル、そしてそれを基礎としてfinalテーブルに追加します... VFPのカーソルはセルフクリーニングです。つまり、それらは閉じられるとすぐに消去される一時ファイルであり、接続を閉じるとそれらが解放されます。 .. そのような

String script = "[create cursor C_SomeTempArea( FinalCol1 c(20), "
              +    "FinalCol7 int, AnotherCol c(5) )] +chr(13)+chr(10)+ " 
              + "[APPEND FROM OtherTextSource TYPE CSV] +chr(13)+chr(10)+ " 
              + "[SELECT 0] +chr(13)+chr(10)+ " 
              + "[USE YourFinalTable] +chr(13)+chr(10)+ " 
              + "[Append from C_SomeTempArea]"

次に、発行します

YourConnection.ExecuteNonQuery( "ExecScript( " + script + " ) " );

編集-フィードバックから

これはDBASEに基づいているため、VFP OleDb Managerをダウンロードして、上記との接続を行うことを検討しますが、最後にテーブルを使用して追加する代わりに、最後の部分のみを変更します...

削除する

+ "[USE YourFinalTable] +chr(13)+chr(10)+ " 
+ "[Append from C_SomeTempArea]"

そしてintを入れます

   + "[COPY TO TEMPImport TYPE FOXPLUS]"

タイプFOXPLUSにコピーすると、DBASEがITOleDbプロバイダーを介して認識するディスク上の物理テーブルに配置されます。次に、dbaseへの接続に戻り、

insert into (YourTable) select * from TempImport

はい、新しいOleDbプロバイダーが含まれますが、汗をかくことなくそのようなインポートを実行した場合のVFPSCREAMSのパフォーマンス...

于 2011-03-09T14:10:47.080 に答える