Зміна часу очікування 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
Ви маєте на увазі встановити час очікування з’єднання після спроби відкрити з’єднання? ви маєте на увазі командний тайм-аут?
Alex K.

2
Я справді, насправді не розумію, чому вони зробили властивість лише для читання. Потрібно читати-писати, ІМО.
xofz

Властивість доступна лише для читання після підключення. Див. Інші відповіді для обговорення. ConnectionTimeout впливає на час очікування під час спроби підключення. часто корисно збільшити це значення для Azure SQL DB. CommandTimeout впливає на час очікування під час запуску запиту.
Білл Гібсон - MSFT

@Sam Pearson Це читання-запис доти, доки з'єднання не буде відкрито, тобто під час з'єднання. називається. З цього моменту таймер вже працює.
WonderWorker

Відповіді:


156

Якщо ви хочете вказати час очікування для конкретного запиту, тоді CommandTimeout - це шлях вперед.

Його використання:

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

17
Він не говорить про тайм-аут команди, він говорить про тайм-аут з'єднання.
LarryBud

39

Ви можете встановити значення часу очікування в рядку підключення, але після підключення воно буде лише для читання. Детальніше ви можете прочитати за адресою http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

Як припускає Аніл, ConnectionTimeout може бути не тим, що вам потрібно; він контролює, скільки часу буде чекати драйвер ADO при встановленні нового з'єднання. Здається, ваше використання вказує на необхідність чекати довше, ніж зазвичай, щоб виконати певний запит SQL, і в цьому випадку Anil має рацію; використовуйте CommandTimeout (що є R / W), щоб змінити очікуваний час завершення для окремого SqlCommand.


20

Більш чистий спосіб - встановити connectionString у файлі xml, наприклад 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

@ m0g Я не розумію, чому це не прийнята відповідь. Йдеться, мабуть, про дуже чітке питання про час очікування підключення, який за замовчуванням становить 15, і є властивістю лише для читання SqlConnection, яку потрібно визначити у рядку підключення. Рядок коду, який перелік плакатів спеціально намагається встановити SqlConnection.ConnectionTimeout. Тайм-аут команди за замовчуванням дорівнює 30 і є параметром читання / запису команди SqlCommand, зовсім іншого об'єкта. Повідомлення про помилку запитання показує значення 15, і в питанні конкретно сказано SqlConnection, а не SqlCommand.
Bacon Bits

1
@BaconBits те, що описував та задавав плакат запитання, відрізняється від того, що він хоче, тому прийнята відповідь - це щось інше.
m0g

8

Ви можете додати Connection Timeout=180;до рядка з'єднання


4
Час очікування підключення відрізняється від CommandTimeout. Час очікування підключення - це час, необхідний для вирішення початкового підключення до бази даних. CommandTimeout змінює період очікування для конкретного запиту.
m0g

7

Ви також можете використовувати SqlConnectionStringBuilder

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

6

Стара публікація, але в міру з’ясування того, що я шукав, я думав додати трохи інформації до цієї теми. Я збирався додати коментар, але у мене недостатньо представників.

Як казали інші:

ConnectionTimeout використовується для початкового підключення

command.CommandTimeout використовується для окремих пошуків, оновлень тощо.

Але:

ConnectionTimeout також використовується для фіксації та відкотування транзакцій.

Так, це абсолютно божевільне дизайнерське рішення.

Отже, якщо у вас виникає час очікування при фіксації або відкоті, вам потрібно буде збільшити це значення за допомогою рядка підключення.


"Connection.ConnectionTimeout також використовується для здійснення та відкочування транзакцій. Так, це абсолютно божевільне дизайнерське рішення." Справді? Я не вірю, що це правда. Якщо це було правдою, то будь-яка транзакція, яка триває довше, ніж час очікування з’єднання, що становить 15 секунд, зазнала б невдачі. Вам потрібно уточнити.
Трійко

Тепер, якщо ви маєте на увазі, що він використовувався як тайм-аут для подання самої команди фіксації або відкочування, то ні ... це не божевільне рішення. В основному це миттєва команда, яка повинна негайно повернутися, оскільки вона просто сигналізує серверу про фіксацію або відкат. Якщо йому не вдається дістатися до сервера і негайно отримати відповідь назад, то це, по суті, час очікування з’єднання, саме тому має сенс використовувати такий спосіб.
Трійко

3

Ви можете встановити час очікування з'єднання на рівень з'єднання та рівень команди.

Додайте "Час очікування з'єднання = 10" до рядка з'єднання. Тепер час очікування з'єднання становить 10 секунд.

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

}

Встановіть для властивості 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;
    }

}


0

Я знайшов чудовий допис у блозі на цю тему: https://improve.dk/controlling-sqlconnection-timeouts/

В основному, ви або встановлюєте час очікування підключення в рядку підключення, або ви встановлюєте ConnectionTimeout на об'єкті команди.

Майте на увазі, що час очікування становить секунди.


Привіт і ласкаво просимо до SO! Будь ласка, прочитайте екскурсію та Як мені написати хорошу відповідь? Додавання зразків коду завжди корисно.
Томер Шетах

Уникайте використання лише посилань, вони можуть змінитися в майбутньому. Додайте декілька цінних порад та кілька вихідних кодів, які допоможуть уточнити вашу відповідь у разі потреби
ColinWa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.