본문 바로가기

c#/.net

C# fatal error encountered attempting to read the resultset 오류 처리

C# 클라이언트 프로그램으로 대량의 데이터를 Insert 시키는 과정에서

'fatal error encountered attempting to read the resultset' 라는 문구를 띄우면서 에러가 발생하였다.

해당 문구를 검색해보니 my sql에 connection을 하고 어떠한 이유에서든지 connection이 끊기게 되면 해당 에러문구를 발생시키는 듯 합니다.

다른 사람들의 케이스로는 

1.my sql 버젼 문제

2.max connection pool 문제

3.time out 문제

이렇게 있는듯 합니다.

저의 경우에는 db tool 에서는 해당 쿼리가 제대로 실행되는데 c#프로그램에서 돌리면 에러가 발생하므로 c#코드에서 mysql을 connection하는 문제라는 것이 유추 되었습니다.

처음에는 connection String의 설정 시간이 짧아서 그런줄 알고 Connection String의 설정 시간을 늘려주었습니다.

_connectionString = "Server=localhost;Database=test;User ID=root;Password=1234; AllowLoadLocalInfile=true;allow user variables=true; Connect Timeout=86400;";

 

그러나 똑같이 에러가 발생하여 원인을 찾아보던 도중 

mySqlCommand 객체에서 CommandTimeout이라는 오류 발생 시간 설정 항목이 있는데 해당부분을 설정을 하지 않게 되면 기본적으로 Timeout 시간이 30초로 설정되다고 합니다.

https://dev.mysql.com/doc/connector-net/en/connector-net-programming-mysqlcommand.html

그래서 해당 로직에 아래와 같이 추가 

command.CommandTimeout = 99999;

 

아래는 추가된 코드이다

public int ExcuteNonQuery(string query)
       {
           try
           {
               using (MySqlConnection connection = new MySqlConnection(_connectionString))
               {
                   // 연결 열기
                   connection.Open();
 
                   // MySQL 명령 객체 생성
                   using (MySqlCommand command = new MySqlCommand(query, connection))
                   {
                       command.CommandTimeout = 99999;
                       // Delete 쿼리 실행 및 영향 받은 행 수 반환
                       int row = command.ExecuteNonQuery();
 
                       return row;
                   }
               }         
           }
           catch (Exception ex)
           {
               Console.WriteLine($"오류: {ex.Message}");
               return -1;
           }
       }

 

이렇게 위처럼 Timeout 설정을 최대로 해두니 에러는 발생하지 않았습니다.

저의 경우에는 대량의 txt,csv파일을 insert하다보니 어쩔수 없게 timeout 설정을 길게 해두었지만 저렇게 하는게 좋지않은거라는것은 딱봐도 알수 있기에 추후에 다른 상황에서 발생 한다면 다른 방법을 찾아봐야겠습니다.