0

CSV ファイルを MySQL テーブルに取得しようとしています。次のスレッドを参照してください。

CSV を MySQL にロードする これはバグですか? - ファイルが見つからないという例外

ファイル名に二重のバックラッシュがあるため、コマンドを実行すると例外がスローされることがわかりました。CSV ファイルを実行可能ファイルがある場所に移動し、ファイル名のみを指定すると、正常に実行されます。問題は、MySQL ドキュメントに従って、LOAD DATA ステートメントがファイル名の文字列のみを受け入れることです。パラメーターを渡すことができず、C# で最初にエスケープせずに文字列で '\' を指定する方法がわかりません。コマンド文字列を作成するために String.Format() を使用しています。String.Format(@"") の両方を試しましたが、@ なしではどちらも機能しません。誰にも提案はありますか?フォーラムを検索したところ、PHP の例が見つかりました。C# 用のものがあるかどうか疑問に思いました。

これが私が今持っているコードです。ここで、InputFileListView は、ユーザーがデータベースにロードするために選択したファイルのリストです。問題は、ファイル パス情報にアクセスする ToString() メソッドのいずれかが文字列に \ を挿入することです。これにより、コマンドの実行で問題が発生します

IEnumerable<FileInfo> files = this.InputFileListView.Items.Cast<FileInfo>();

 // just using the first entry in InputFileListView for now
string working = String.Format("LOAD DATA LOCAL INFILE '{0}' IGNORE", files.FirstOrDefault().ToString()) +
                         String.Format("INTO TABLE {0} COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\n'", "by_switch")+
                         String.Format("IGNORE 1 LINES (`Switch`,`Port`,`WWPN`,@the_slot,`Port Index`,@the_time,`Interval`,`Port Send Packet Rate`,")+
                         String.Format("`Port Receive Packet Rate`,`Total Port Packet Rate`,`Port Send Data Rate`,")+        
                         String.Format("`Port Receive Data Rate`,`Total Port Data Rate`,`Port Peak Send Data Rate`,`Port Peak Receive Data Rate`,")+ 
                         String.Format("`Port Send Packet Size`,`Port Receive Packet Size`,`Overall Port Packet Size`,`Error Frame Rate`,")+
                         String.Format("`Dumped Frame Rate`,`Link Failure Rate`,`Loss of Sync Rate`,`Loss of Signal Rate`,`CRC Error Rate`,")+
                         String.Format(" `Short Frame Rate`,`Long Frame Rate`,`Encoding Disparity Error Rate`,")+         
                         String.Format("`Discarded Class3 Frame Rate`,`F-BSY Frame Rate`,`F-RJT Frame Rate`, `Port Send Bandwidth Percentage`,")+
                         String.Format("`Port Receive Bandwidth Percentage`, Overall Port Bandwidth Percentage`,`Primitive Sequence Protocol Error Rate`,")+
                         String.Format("`Invalid Transmission Word Rate`,`Link Reset Transmitted Rate`,`Link Reset Received Rate`)")+ 
                          String.Format("SET Slot = nullif(@the_slot,''),")+ 
                          String.Format(@"Time= str_to_date(@the_time,'%m/%d/%y %h:%i %p')");

私はこれを試しましたが、うまくいきませんでした。

  string tester = files.FirstOrDefault().Directory.ToString();
        tester = tester.Replace(@"\\", @"\");
4

1 に答える 1

0

質問に対する答えは見つかりませんでしたが、回避策を見つけました。私がやりたいことは、BulkLoader を使用して機能しました。

var bl = new MySqlBulkLoader(sqlconnect);
      bl.TableName = "by_switch";
      bl.FieldTerminator = ",";
     bl.LineTerminator = "\n";
      bl.FileName = files.FirstOrDefault().ToString();
       bl.NumberOfLinesToSkip = 1;
    int inserted = bl.Load();
于 2012-09-25T02:09:05.067 に答える