Christopher Smit Ответов: 2

Приложения, начиная с Windows вызывает ошибки с#


Хороший день,

У меня есть приложение C#, которое начинается с windows. В тот момент, когда приложение запускается, оно немедленно проверяет базу данных на наличие каких-либо данных. Когда приложение запускается нормально, все работает, но когда я перезагружаюсь и позволяю ему запуститься с windows, он выдает мне ошибку "программа перестала работать". Я проверил четные журналы, и мне кажется, что приложение пытается подключиться к базе данных до запуска SQL Server. Как можно преодолеть эту проблему?

Как я и сказал. После того как он выдаст мне ошибку, я могу просто дважды щелкнуть значок на рабочем столе, и он отлично запустится. Таким образом, проблема должна быть связана с тем, что SQL Server не работает должным образом, когда приложение пытается начать работу с windows.

Что я уже пробовал:

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

Kevin Marois

1) Есть ли у вас свой собственный журнал регистрации, чтобы увидеть, где он терпит неудачу?

2) Если вы считаете, что БД еще не готова, можете ли вы сделать некоторую паузу/тестирование, чтобы убедиться, что это так?

3) какую БД вы используете?

Dan Sporici

Публикую это как комментарий, потому что я не уверен, правильно ли я понял...но почему бы вам не обернуть часть соединения в блок try-catch, а затем в цикл while? И просто используйте переменную, чтобы сигнализировать, если соединение удалось (просто добавьте ее под вызовом метода соединения, если он не работает, значение не изменяется => повторите попытку); а также спящий режим в течение нескольких секунд между неудачными соединениями.

Christopher Smit

@Apex95, это неплохая идея. Я проверю это. Я думаю, вы можете опубликовать его как ответ, и если он сработает, я его приму.

@Kevin, я использую базу данных SQL. Я попробую метод, предоставленный Apex. Это должно быть достаточно хорошо для паузы/тестирования, о котором вы говорите?

2 Ответов

Рейтинг:
19

Karthik_Mahalingam

Используйте это, чтобы проверьте, работает ли SQL-сервер или нет [^]
использовать Таймер[^] чтобы проверить соединение каждые 30 секунд или 1 минуту, пока оно не будет подключено, как только соединение будет установлено, остановите таймер в истекшем событии.


Рейтинг:
10

Dan Sporici

Хорошо, поскольку вы согласились с этим, я расширю комментарий с помощью некоторого кода здесь. Вот как я себе все это представлял.

static void connectToDB()
{
    // considering that the connection always throws an Exception
    throw new Exception("DB is down");
}

static void Main(string[] args)
{
    bool connected = false;

    while (!connected)
    {
        try
        {
            connectToDB();
            connected = true;
        }
        catch (Exception ex)
        {
            System.Threading.Thread.Sleep(1000);
        }
    }
}


Посмотрим, поможет ли это; если нет, нам может понадобиться дополнительная информация.


Christopher Smit

Это приводит к тому, что он не запускается, но и не дает никаких ошибок. Экран-заставка-это просто погрузка навсегда. Поэтому я добавил сообщение об ошибке, и ошибка, которую я получаю, звучит так: "попытка прикрепить базу данных с автоматическим именем для файла xxxx не удалась.База данных с таким же именем существует или не может быть открыта, или она находится на общем ресурсе UNC.

Это должно быть потому, что SQL еще не запущен. Насколько я могу судить. Потому что, как я уже сказал, в тот момент, когда я пытаюсь запустить его, когда компьютер уже запущен, он работает

Christopher Smit

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