2014-10-17 4 views
1

"FOR UPDATE"를 사용하여 SELECT를 수행하는 응용 프로그램 열기가 열려 있습니다.C# ExecuteReader를 실행하는 대신 예외를 throw하는 방법

제 애플리케이션에서 애플리케이션이 중단 (전까지 그것이 시간 초과)을 동일한 행에 액세스를 시도하는 경우 : 예외가 발생

:

// Simplified code 
var connection = new MySqlConnection(connectionString); 
connection.Open(); 

var transaction = connection.BeginTransaction(); 

MySqlCommand command = new MySqlCommand(sqlQuery, connection, transaction); 
MySqlDataReader dataReader = command.ExecuteReader(); // HANGS 

이 SQLEXCEPTION하에 말한다 documentation 따르면 잠긴 행에 대해 명령을 실행하는 동안

이것은 내가 원하는 것입니다. 예외를 얻으려고합니다. 즉시. 명령 시간 초과를 변경하려고 시도했지만 TimeoutException과 정확한 이유를 설명하는 내용이 없습니다.

+0

당신은'SqlCommand.ExcecuteReader()'와 관련된 MSDN 문서를 참조하고 있습니다. 귀하의 코드에서 당신이 사용하고있는'MySqlCommand.ExcecuteReader()'는 .NET Framework의 일부가 아닌 것으로 알고 있습니다. MySqlCommand 클래스의 개발자의 특정 문서는 무엇을 말합니까? – InBetween

답변

0

시도해 보았습니까?

var connection = new MySqlConnection(connectionString); 
try 

{ 


connection.Open(); 

var transaction = connection.BeginTransaction(); 

MySqlCommand command = new MySqlCommand(sqlQuery, connection, transaction); 
MySqlDataReader dataReader = command.ExecuteReader(); 
} 
catch (Exception) 
     { 
      throw; 
     } 
+0

예 - 단순화 된 코드는 유감입니다. 모든 것이 try-catch에 있습니다. 문제는 프로그램이 시간 초과 될 때까지 command.ExecuteReader 행에 멈추는 것입니다. 그런 다음 시간 초과 예외가 발생했습니다 –

+0

이 항목을 확인하십시오. 도움이 되시길 바랍니다 http://stackoverflow.com/questions/1719305/timeout-exception-causes-sqldatareader-to-close –

+0

아니요, 운이 좋지 않습니다. –

0

SQL 연결의 기본 제한 시간은 15 초 또는 30 초입니다. 코드가 데이터 읽기를 시도하면 응답 또는 시간 초과를 기다립니다.

connection.ConnectionTimeout = 1; //timeout in seconds 
//initialize command, connection etc 
bool commited; 
while(!commited){ 
    try{ 
     MySqlDataReader dataReader = command.ExecuteReader(); 
     commited = true; 
    }catch(SqlException e) { 
     commited = false; 
    } 
    //code to force program update. 
} 

그리고 당신이 정말로 원하는 경우 : 프로그램을 새로 고치는 동안 제한 시간을 감소하고 다시 연결을 시도 - (SQL에서만 초보자 내가 비록 얼마나 실제 모르겠어요)이 일을하는 한 가지 방법 "잠긴 행"메시지가 나타나면 1 초 제한 시간 중 15 개 (또는 원하는만큼의 금액)를 선택하면됩니다.

+0

이것은 시간 초과가 발생했는지 여부 만 알려주는 매우 일반적인 해결책입니다. 시간 초과 예외가 발생하고 더 구체적인 SQL 관련 예외는 발생하지 않습니다. –

+0

제 아이디어는 제한 시간을 줄이고 15 초 또는 30 초를 기다리지 않고 프로그램이 업데이트 할 수있는 몇 가지 연결을 시도하는 것입니다. 또한 제한 시간을 줄인 다음 예외를 잡을 수도 있습니다. 비동기 연결이나 멀티 스레딩이 없으면 프로그램은 시간 초과 기간이 지날 때까지 응답을 기다리지 않고 어느 정도 시간이 걸리므로 어느 쪽이든 처리 할 수 ​​있습니다. 슬프게도, 나는 이것을 훨씬 넘어서 도울 수 없다. – Zero

관련 문제