2012-09-24 2 views
0

C#에서 MySQL 데이터베이스에 CSV 파일을로드하려고하는데 계속 예외가 발생하여 결과 집합에서 읽을 수 없습니다. MySQL Workbench에서 DB2 Workbench의 CSV 파일을 오류없이로드 할 수있는 구문이 있습니다. 내 프로그램에서 그것을 시도하면서, 나는 여전히 예외를 얻는다. 현재 작업하고있는 파일에는이 경로와 파일 이름이 있습니다.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의 문 및 쿼리를 exccuting입니다. 죄송 문자열이 좀 깁니다

Port Send Packet Size

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 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,,210 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(); 
+0

오우 파일을 OLEDB를 사용하여 데이터 테이블에로드 할 수 있으므로 파일 경로가 알 수 있습니다. 나는 그것이 MySQL의 문제라고 생각한다. 데이터 라이브러리, 나는 그것을 고치는 방법을 모른다. –

답변

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); 
관련 문제