So verwenden Sie RetryLogicProvider für den Verlust der Verbindung während des BefehlsC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 So verwenden Sie RetryLogicProvider für den Verlust der Verbindung während des Befehls

Post by Anonymous »

Ich verwende SqlretryLogicBaseProvider, um meine Wiederholungen für eine SQL Azure .NET Framework 4.8 Win Forms -Anwendung zu definieren. Ich fange gerade erst an, die zugrunde liegenden Mechanismen zu verstehen, indem ich einfache Trennungstests durchführe. Ich habe auch einige Kunden mit einem sehr instabilen Internet. Wenn ich also die Internetverbindung verliere, kann es ein Problem sein, einen Befehl auszuführen. Daher habe ich der transienten Fehlerliste Fehlercode 11001 hinzugefügt. Ich habe jedoch einfach nicht den richtigen Weg, um die Wiederholungslogik zu konfigurieren. Wenn das Internet beim Öffnen der Verbindung verloren geht, ist alles "in Ordnung", Connection.open wird wiederholt. Wenn das Internet jedoch verloren geht. Der aktuelle Zustand der Verbindung ist 'geschlossen'. < /P>
Wo muss ich den Verbindungsstatus verarbeiten? Im Wiederholungsereignis des SqlretrylogicBaseProviders? Wird es wiedergegeben, wenn es dort behandelt wird? < /P>
Hier ist mein Code: < /p>

Code: Select all

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;
}
< /code>
 Bearbeiten 1: < /strong>
Ich habe das Wiederholungsereignis geändert. Der RetrylogicProvider ist immer noch Teil der Verbindung. Das [url=viewtopic.php?t=15738]Problem[/url] ist nun, dass der interne Wiederholungsschalter verloren geht und immer auf die Nummer 1 eingestellt ist, so dass meine Verbindung in einer endlosen Schleife wiedergegeben wird. Konnte noch nicht herausfinden, wie ich das erhöhen konnte. < /P>
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();
}
}
};

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post