помогите с попыткой поймать заявление - PullRequest
1 голос
/ 29 июня 2011

я создаю веб-приложение, которое подключается к базе данных и использует ODBC-коннектор, используя для этого следующий код

private void SetupConnection()
{
    conn.ConnectionString = 
        ConfigurationManager.ConnectionStrings["live"].ConnectionString;

    OdbcDataAdapter da = 
        new OdbcDataAdapter("SELECT * FROM MTD_FIGURE_VIEW1 '", conn);

    da.Fill(ds);
}

Я хочу создать оператор try catch, который будет пытаться подключиться к базе данных.

psudocode будет использовать функцию выше, если не удается подключиться, попробуйте снова, если она подключается без каких-либо ошибок.

Может кто-нибудь, пожалуйста, помогите мне в этом

Вопрос актуален из комментариев:

я просто хочу, чтобы он продолжал пробовать Причиной этого является веб-приложение я делаю никогда не переключится постоянно обновляемые данные, но база данных переключается на два часа каждую ночь для резервного копирования во время этого период, когда я хочу, чтобы приложение продолжало пытается подключиться

Ответы [ 3 ]

2 голосов
/ 29 июня 2011
private void SetupConnection()
{
    conn.ConnectionString = 
        ConfigurationManager.ConnectionStrings["ZenLive"].ConnectionString;

    bool success = false;

    while(!success)
    {
        try
        {
            OdbcDataAdapter da = 
               new OdbcDataAdapter("SELECT * FROM MTD_FIGURE_VIEW1 '", conn);

            da.Fill(ds);
            success = true;
        }
        catch(Exception e)
        {
            Log(e);
            Thread.Sleep(_retryPeriod)
        }
    }
}

Заметьте, как прокомментировали люди, это действительно не очень хорошая идея . Вам нужен какой-то способ, чтобы отличить «ожидаемое» исключение, когда база данных выключена и вы хотите продолжать повторную попытку, и случай, когда произошло что-то неожиданное и вы не хотите продолжать попытки.

2 голосов
/ 29 июня 2011

Как насчет,

const int MaxRetries = 42 //or any other number you like

for (int r = 1; r <= MaxRetries; r++)
{
    try
    {
        //The thing we want to test
        break;
    }
    catch (SomeExceptionWeWantToIgnore)
    {
        System.Threading.Thread.Sleep(1000) 
        //Or any number of milliseconds you like (not 0)
    }
} 

Если это что-то, что вы хотели бы сделать много раз и использовать повторно.Вы могли бы подумать о том, чтобы включить его в функцию повторного запуска, как я делал в этот ответ , предупреждение это, вероятно, излишнее.

1 голос
/ 29 июня 2011

Если база данных не работает, нет смысла пытаться подключиться к ней. Вы просто тратите свое время, пытаясь подключиться к чему-то, что отключено для резервного копирования. Я бы сделал что-то вроде этого:

DateTime backupStart = Convert.ToDateTime("20:00:00");
DateTime backupEnd = Convert.ToDateTime("22:00:00");
DateTime now = DateTime.Now;

while (true)
{
    // If its backup time then sleep for 2 hours, 0 min and 0 seconds
    if (now > backupStart && now < backupEnd)
    {
        System.Threading.Thread.Sleep(new TimeSpan(2, 0, 0));
        now = DateTime.Now; // So we dont sleep again later
    }

    try
    {
        // Try db connect
        // Break if successful
        break;
    }
    catch (Exception ex)
    {
        // Wait 30 seconds then loop then try again
        System.Threading.Thread.Sleep(new TimeSpan(0, 0, 30));
    }
}
...