SqlConnection 시간 제한 변경


81

기본 SqlConnection제한 시간 인 15 초 를 재정의하려고하는데 다음 과 같은 오류가 발생합니다.

속성 또는 인덱서는 읽기 전용이므로 할당 할 수 없습니다.

이 문제를 해결할 방법이 있습니까?

using (SqlConnection connection = new SqlConnection(Database.EstimatorConnection))
{
   connection.Open();

   using (SqlCommand command = connection.CreateCommand())
   {
       command.CommandType = CommandType.StoredProcedure;
       connection.ConnectionTimeout = 180; // This is not working 
       command.CommandText = "sproc_StoreData";
       command.Parameters.AddWithValue("@TaskPlanID", order.Projects[0].TaskPlanID);
       command.Parameters.AddWithValue("@AsOfDate", order.IncurDate);

       command.ExecuteNonQuery();
    }
}

5
연결을 시도한 후 연결 시간 제한을 설정 하시겠습니까? commandtimeout을 의미합니까?
Alex K.

2
나는 그들이 속성을 읽기 전용으로 만든 이유를 정말로 알지 못합니다. 읽기-쓰기 였어야 했어, IMO.
xofz

이 속성은 연결 후 읽기 전용입니다. 토론을 위해 다른 응답을 참조하십시오. ConnectionTimeout은 연결을 시도 할 때 제한 시간에 영향을줍니다. Azure SQL DB의 경우이를 늘리는 것이 유용한 경우가 많습니다. CommandTimeout은 쿼리를 실행할 때 시간 제한에 영향을줍니다.
Bill Gibson-MSFT

@Sam Pearson 연결이 열릴 때까지 즉, connection.Open (); 호출됩니다. 이 시점부터 타이머가 이미 실행 중입니다.
WonderWorker 2017-08-30

답변:


155

특정 쿼리에 대한 시간 제한을 제공하려면 CommandTimeout이 앞으로 나아가는 방법입니다.

사용법은 다음과 같습니다.

command.CommandTimeout = 60; //The time in seconds to wait for the command to execute. The default is 30 seconds.

15
그는 명령 시간 초과에 대해 말하는 것이 아니라 연결 시간 초과에 대해 말하는 것입니다.
LarryBud

39

연결 문자열에 시간 제한 값을 설정할 수 있지만 연결 한 후에는 읽기 전용입니다. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx 에서 자세한 내용을 읽을 수 있습니다 .

Anil이 암시 하듯이 ConnectionTimeout은 필요한 것이 아닐 수 있습니다. 새 연결을 설정할 때 ADO 드라이버가 대기하는 시간을 제어합니다. 귀하의 사용법은 특정 SQL 쿼리가 실행될 때까지 평소보다 오래 기다려야 함을 나타내는 것 같습니다.이 경우 Anil이 정확히 맞습니다. CommandTimeout (R / W)을 사용하여 개별 SqlCommand의 예상 완료 시간을 변경합니다.


19

더 깨끗한 방법은 xml 파일에서 connectionString을 설정하는 것입니다 (예 : Web.Confing(WepApplication)또는 App.Config(StandAloneApplication).

 <connectionStrings>
    <remove name="myConn"/>
    <add name="myConn" connectionString="User ID=sa;Password=XXXXX;Initial Catalog=qualitaBorri;Data Source=PC_NAME\SQLEXPRESS;Connection Timeout=60"/>
  </connectionStrings>

코드로 다음과 같은 방법으로 연결할 수 있습니다.

public static SqlConnection getConnection()
{
        string conn = string.Empty;
        conn = System.Configuration.ConfigurationManager.ConnectionStrings["myConn"].ConnectionString;
        SqlConnection aConnection = new SqlConnection(conn);
        return aConnection;
}

ConnectionTimeout인스턴스 생성 만 설정할 수 있습니다 . 인스턴스가 생성 될 때이 값을 변경하지 않습니다.


17

언제든지 연결 문자열에 추가 할 수 있습니다.

connect timeout=180;

2
연결 시간 초과는 CommandTimeout과 다릅니다. 연결 시간 초과는 데이터베이스에 대한 초기 연결을 확인하는 데 걸리는 시간입니다. CommandTimeout은 특정 쿼리의 제한 시간을 변경합니다.
m0g 2014-04-04

@ m0g 왜 이것이 받아 들여지는 대답이 아닌지 이해할 수 없습니다. 여기서 질문은 아마도 연결 시간 제한에 관한 것입니다. 기본값은 15이며 연결 문자열에 정의되어야하는 SqlConnection의 읽기 전용 속성입니다. 포스터에 나열되는 코드 줄은 특히 SqlConnection.ConnectionTimeout을 설정하려고합니다. Command Timeout의 기본값은 30이며 완전히 다른 개체 인 SqlCommand의 읽기 / 쓰기 매개 변수입니다. 질문의 오류 메시지에 15의 값이 표시되고 질문에는 SqlCommand가 아니라 SqlConnection이 구체적으로 표시됩니다.
Bacon Bits

1
@BaconBits 질문 포스터가 설명하고 요청한 내용과 그가 원하는 내용이 다르므로 허용되는 답변이 다릅니다.
m0g

8

Connection Timeout=180;연결 문자열에 추가 할 수 있습니다.


4
연결 시간 초과는 CommandTimeout과 다릅니다. 연결 시간 초과는 데이터베이스에 대한 초기 연결을 확인하는 데 걸리는 시간입니다. CommandTimeout은 특정 쿼리의 제한 시간을 변경합니다.
m0g 2014-04-04

7

SqlConnectionStringBuilder를 사용할 수도 있습니다.

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectTimeout = 10;
using (var connection = new SqlConnection(builder.ToString()))
{
    // code goes here
}

6

이전 게시물이지만 내가 검색 한 내용이 나오면이 주제에 정보를 추가 할 것이라고 생각했습니다. 코멘트를 추가하려고했는데 담당자가 부족합니다.

다른 사람들이 말했듯이 :

connection.ConnectionTimeout은 초기 연결에 사용됩니다.

command.CommandTimeout은 개별 검색, 업데이트 등에 사용됩니다.

그러나:

connection.ConnectionTimeout 트랜잭션 커밋 및 롤백 사용됩니다.

예, 이것은 절대적으로 미친 디자인 결정입니다.

따라서 커밋 또는 롤백시 시간 초과가 발생하는 경우 연결 문자열을 통해이 값을 늘려야합니다.


"Connection.ConnectionTimeout은 트랜잭션 커밋 및 롤백에도 사용됩니다. 예, 이것은 절대적으로 미친 설계 결정입니다." 정말? 나는 이것이 사실이라고 믿지 않는다. true이면 연결 제한 시간 15 초보다 오래 지속되는 트랜잭션이 실패합니다. 명확히해야합니다.
Triynko 19.05.09

이제 커밋 또는 롤백 명령 만 제출하기위한 시간 제한으로 사용되었다는 의미라면 아니 ... 그건 미친 결정이 아닙니다. 이는 기본적으로 서버에 커밋 또는 롤백을 알리는 신호이므로 즉시 반환해야하는 즉각적인 명령입니다. 서버에 도달하지 못하고 즉시 응답을 받으면 기본적으로 연결 시간 초과이므로 그런 방식으로 사용하는 것이 합리적입니다.
Triynko

3

연결 시간 제한을 연결 수준 및 명령 수준으로 설정할 수 있습니다.

연결 문자열에 "Connection Timeout = 10"을 추가합니다. 이제 연결 시간 제한은 10 초입니다.

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Connection Timeout=10";
using (var con = new SqlConnection(connectionString))
{

}

of CommandTimeout 속성을 SqlCommand로 설정

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword";
using (var con = new SqlConnection(connectionString))
{

    using (var cmd =new SqlCommand())
    {
        cmd.CommandTimeout = 10;
    }

}

2

당신은 사용해야합니다 command.CommandTimeout

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.