Как использовать RetryLogicProvider для потери соединения во время командыC#

Место общения программистов C#
Ответить
Anonymous
 Как использовать RetryLogicProvider для потери соединения во время команды

Сообщение Anonymous »

Я использую SqlRetryLogicBaseProvider для определения своих повторных попыток для приложения Win Forms SQL Azure .Net Framework 4.8. Я только начинаю понимать основные механизмы, выполняя простые тесты на отключение. У меня также есть клиенты с очень нестабильным Интернетом, поэтому потеря подключения к Интернету при выполнении команды может стать проблемой. Поэтому я добавил код ошибки 11001 в список временных ошибок. Однако я просто не понимаю, как правильно настроить логику повтора. Если Интернет пропадает при открытии соединения, все «в порядке», Connection.open повторяется. Но если подключение к Интернету потеряно при выполнении команды.ExecuteReader(), после первой повторной попытки команды выдается ошибка, и повторной попытки соединения не происходит.
Исключение: ExecuteReader требует открытия и доступное соединение. Текущее состояние соединения — «закрыто».
Где мне нужно обрабатывать состояние соединения? В событии повторной попытки SqlRetryLogicBaseProvider? Будет ли он повторен, если он будет обработан там?
Вот мой код:
var options = new SqlRetryLogicOption()
{
// Tries 5 times before throwing an exception
NumberOfTries = 5,
// Preferred gap time to delay before retry
DeltaTime = TimeSpan.FromSeconds(5),
// Maximum gap time for each delay time before retry
MaxTimeInterval = TimeSpan.FromSeconds(60),
TransientErrors = new List { -1, -2, 0, 109, -2146232060, 596, 1204, 1205, 1222, 49918, 49919, 49920, 4060, 4221, 40143, 40613, 40501, 40540, 40197, 10929, 10928, 10060, 10054, 10053, 997, 233, 64, 18401, 11001 ,1232}
};

// Create a retry logic provider
SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
LogRetry(e);
// handle connection loss here? if so, how?
}

try
{
using (var connection = new SqlConnection(ConnectionString))
{
//retry provider for connection:
connection.RetryLogicProvider = provider;

// SqlParameter parameter;
const string selectCmd = "SELECT data FROM mydata WHERE dataID = @dataID";

using (var command = new SqlCommand(selectCmd, connection))
{
SqlParameter parameter = new SqlParameter("@dataID", SqlDbType.NVarChar, 9);
parameter.Value = did;
command.Parameters.Add(parameter);
// set retry provider for command:
command.RetryLogicProvider = provider;

connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("{0}", reader.GetString(0));
}
}
}
}
catch (Exception ex)
{
return String.Empty;
}

РЕДАКТИРОВАТЬ 1:
Я изменил событие повторной попытки. RetryLogicProvider по-прежнему является частью соединения. Проблема теперь в том, что внутренний счетчик повторов теряется и всегда настроен на повтор номер 1, так что мое соединение повторяется в бесконечном цикле. Пока не удалось выяснить, как это увеличить.
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
LogRetry(e);

if (s is SqlConnection)
{
var conn = s as SqlConnection;
conn.Close();
conn.Open();
}
else
{
if (s is SqlCommand)
{
var cmd = s as SqlCommand;
cmd.Connection.Close();
cmd.Connection.Open();
}
}
};


Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-command
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»