0

CSVファイルをC#のMySQLデータベースに読み込もうとしていますが、結果セットから読み取れなかった例外が発生し続けます。MySQLワークベンチで構文をクリーンアップして、CSVファイルをMySQLワークベンチのデータベースにエラーなしでロードできるようにしました。プログラムで試してみても、例外が発生します。私が使用しているファイルには、次のパスとファイル名があります。

D:\SANCentral\Customer Files\ibm\70738\0918\switch port.csv

私が得る例外は、「結果セットから読み取ることができませんでした」です。内部例外を見ると、これでファイルが見つかりません。それがどこから来ているのかわかりません。D:\ Projects\CSVParserは私のプロジェクトの場所です。MySQL.Data.Clientクラスが、ファイルを開くために指定した場所で何かを実行していると想定しています。これは、SQLコマンドがファイルをロードしようとしているパスです。

 {"Could not find file  'D:\\Projects\\CSVParser\\CSVParser\\bin\\Debug\\SANCentralCustomer Filesibm70738'
.":"D:\\Projects\\CSVParser\\CSVParser\\bin\\Debug\\SANCentralCustomer Filesibm70738"}

どうすればこれを修正できますか?デバッガーで解析したいファイルのパスを確認しましたが、正しいです。プロジェクトを実行しているプロジェクトディレクトリに.CSVファイルを移動しようとしましたが、それでも例外が発生しますが、ファイルが見つからないのではなく、パスに不正な文字が含まれています。

ロードを実行するためのC#コードとMySQLステートメントは次のとおりです。

string ConnectionString =  String.Format(@"server=localhost;userid={0};
        password={1};database=PerformanceMonitors;
Allow User Variables=True", user,password);
        MySqlConnection sqlconnect = new MySqlConnection(ConnectionString);
        sqlconnect.Open();

これがMySQLステートメントとクエリの実行です。申し訳ありませんが、文字列は少し長いです:

string working = String.Format(@"LOAD DATA LOCAL INFILE '{0}' IGNORE
INTO TABLE {1} COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\n'
  IGNORE 1 LINES (`Switch`,`Port`,`WWPN`,@the_slot,`Port Index`,@the_time,
`Interval`,`Port Send Packet Rate`,  
`Port Receive Packet Rate`,`Total Port Packet Rate`,`Port Send Data Rate`, 
`Port Receive Data Rate`,`Total Port Data Rate`, 
Peak Send Data Rate`,`Port Peak Receive Data Rate`,

Port Send Packet Size、、、、、、、、、、、、、、、、、、、、、、、、、、) Port Receive Packet Size_ Overall Port Packet Size_
Error Frame Rate_ Dumped Frame Rate_
Link Failure Rate_ Loss of Sync Rate_ Loss of Signal Rate_ CRC Error Rate_
Short Frame Rate_ Long Frame Rate_ Encoding Disparity Error Rate_
Discarded Class3 Frame Rate_ F-BSY Frame Rate_ F-RJT Frame Rate_
Port Send Bandwidth Percentage_ Port Receive Bandwidth Percentage_ Overall Port Bandwidth Percentage_ Primitive Sequence Protocol Error Rate_
Invalid Transmission Word Rate_ Link Reset Transmitted Rate_Link Reset Received Rate

    SET Slot = nullif(@the_slot,''), Time= str_to_date(@the_time,'%m/%d/%y %h:%i %p')", files.FirstOrDefault().ToString(), "by_switch");


       string commandreplaced= working.Replace("\n", "");

        MySqlCommand cmd = new MySqlCommand(commandreplaced,sqlconnect);
        cmd.ExecuteNonQuery();
4

1 に答える 1

3

さて、私はついに答えを見つけました。LOAD DATA FILEステートメントでは、ファイル名が文字列値である必要があり、パラメーター化することはできません。残念ながら、MySQLCommandクラスは、C#文字列オブジェクトのファイルパスにあるエスケープされた\を好まないため、ファイルを見つけることができません。このようにエスケープをエスケープすることで、それを機能させることができました:

//build the LOAD DATA File command
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')");


// now escape the escape character
       commandreplaced = commandreplaced.Replace(@"\", @"\\");

   // now execute the command
        MySqlCommand cmd = new MySqlCommand(commandreplaced,sqlconnect);
于 2012-09-26T20:34:16.257 に答える