2012-09-24 17 views
0

我想獲得一個CSV文件導入到一個MySQL表,看到這個線程:Paramaterize文件名

Loading CSV into MySQL Is This a Bug? - File Not Found Exception

我已經想通了,執行命令是拋出異常由於文件名中的雙重間隙。如果我將CSV文件移動到可執行文件所在的位置,並且只提供文件名,則它運行得很好。問題是LOAD DATA語句只接受字符串作爲文件名,按照MySQL文檔。我無法傳遞一個參數,我不知道如何在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(@"\\", @"\"); 

回答

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();