3

夜間に MSSQL から MySQL サーバーにデータをエクスポートするアプリを作成しています。単純なクエリを使用して前日のすべてのデータを取得し、それを MySQL に取得するためにいくつかの異なるアプローチを試みました。最速のアプローチは MySqlBulkLoader を使用することですが、何らかの理由ですべてのデータを移動していません。挿入を行った後、生成されたテキスト ファイル内のレコードを MySQL 内のレコード数と比較すると、カウントが 1 から 10 までずれている場合があります。

データをテキスト ファイルに取得するために同じ方法を使用しますが、一括アップロードではなくテキスト ファイルの各行をループしてステートメントを挿入すると、すべてのレコードがインポートされます。

現在使用している一括アップロード コードは次のとおりです。最近、FieldQuotationCharacter を追加して、それが役立つかどうかを確認しましたが、そうではありませんでした (それを追加したとき、テキスト生成スクリプトでフィールドを引用符で囲みました)。

uploader.TableName = "testtable";
uploader.FieldTerminator = "\t";
uploader.LineTerminator = "\r\n";
uploader.NumberOfLinesToSkip = 0;
uploader.FileName = updateFile; //this is a variable pointing to the current file
uploader.Timeout = 120;
uploader.FieldQuotationCharacter = '"';
int totalExported = uploader.Load();

何か案は?

4

2 に答える 2

3

少し奇妙に思えますが、気まぐれで、出力ファイルの先頭に空白行を書き込んで、NumberOfLinesToSkip = 1 に設定することにしました。これを行った後、すべてが機能し、レコードが失われることはありませんでした。ちょっと奇妙です。0 に設定しても機能せず、サポートされていないようです。

于 2012-04-12T14:49:20.330 に答える
0

ファイル内の行の約 2/3 をロードしているという同様の問題があり、問題は MySqlBulkLoader によって生成されるロード データ sql の local キーワードの動作であることが判明しました。

デフォルトでは、MySqlBulkLoader.Local == true のようです。これにより、ローカル ファイルを使用できるようになりますが、無効な行のエラー処理にも影響します。行が無効な場合にエラーをスローする代わりに、「警告」が表示されます。ロード データに対して実際の sql コマンドを実行することで、これを確認し、警告を表示できます (これは MySqlBulkLoader が使用するものです)。

load data local infile '/Temp/bb7dd81c-c79f-49c7-9ae4-fdc8e48df6d5.csv'
ignore into table my_staging_tbl
fields terminated by ',' enclosed by '"' escaped by '\\'
lines terminated by '\n'

これにより、影響を受ける行の数とすべての警告のリストが出力されます

私の場合、LineTerminator を「\r\n」ではなく「\n」にして、警告が抑制された後も、ほとんどの行をインポートすることになりました。

デフォルトである Ignore の代わりに MySqlBulkLoader.ConflictOption を MySqlBulkLoaderConflictOption.Replace に設定することで、この動作をオーバーライドできます。これは、重複キーの処理方法にも影響することに注意してください。

mysql のロード データの詳細: http://dev.mysql.com/doc/refman/5.7/en/load-data.html

于 2016-09-13T17:31:30.953 に答える