Graeme Cooper Ответов: 2

Можно ли пропустить ввод пользователя с помощью try and catch?


Я создал код, который обращается к различным серверам sql, извлекает данные в dataTable, а затем вычисляет среднее значение между этими различными таблицами, чтобы затем отобразить его в веб-форме.

Короче говоря, я хотел, чтобы программа обходила/игнорировала недопустимые пользовательские вводы и по-прежнему отображала средние значения в виде таблицы.

Вот что я попробовал ниже:

getUserInput();
                foreach (string item in itemList)
                {//
                    connectionString = string.Format(theString, item); //my modified connection string to allow user to open sql server connection.
                    using (SqlConnection sqlConnect = new SqlConnection(connectionString))
                    {
                                try
                                {
                                    sqlConnect.Open();
                                }
                                catch
                                {
                                    continue;
                                }
                                    sqlQuery1 = new SqlDataAdapter("my sql query",sqlConnect);
createTable();
}


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

try
                                {
                                    sqlConnect.Open();
                                }
                                catch
                                {
                                    continue;
                                }

Graeme Cooper

Просто чтобы добавить больше контекста к проблеме, с которой я сталкиваюсь; когда цикл foreach сталкивается с недопустимым вводом, он игнорирует строку, и моя таблица не генерируется.

RmcbainTheThird

Итак, какие входные данные являются допустимыми или недопустимыми и как они используются? Какое отношение они имеют к sql-запросу?

Graeme Cooper

входные данные (list<string>) вводятся в веб-форму; допустимые входные данные генерируют таблицу средних значений. Информация для таблицы берется из SQL-запроса, и эта информация доступна только в том случае, если входные данные являются допустимыми.
То, что я искал, - это способ сгенерировать эту таблицу независимо от недопустимого ввода или иметь способ удалить недопустимый ввод и сгенерировать таблицу.

2 Ответов

Рейтинг:
7

Graeme Cooper

Удаление элементов при итерации коллекции в C# | CodeAddiction.net[^]

Это работает!!! @OriginalGriff Спасибо за помощь, я попытался сделать ваше предложение раньше, однако у меня все еще была та же ошибка. то, что я сделал, приведено ниже; это работает, но только в том случае, если недопустимый не находится в конце списка элементов (только что закончилось сообщение об удалении недопустимого из пользовательского ввода).

В моем случае:

foreach (string item in itemList.ToArray())
    {
    try
        {
        connectionString = string.Format(theString, item); /
        using (SqlConnection sqlConnect = new SqlConnection(connectionString))
            {
            sqlConnect.Open();
            sqlQuery1 = new SqlDataAdapter("my sql query",sqlConnect);
            createTable();
            ...
            }
        }
    catch {
itemList.Remove(item);
continue;
} // Ignore connections that don't work: we want the average of the others.
    }


Рейтинг:
13

OriginalGriff

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

try...catch существует не для того, чтобы игнорировать проблемы - он существует для того, чтобы вы могли изящно потерпеть неудачу и сообщить о них без сбоя вашего приложения на вашем пользователе.

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

Итак, если бы у меня было 3 соединения; первое и третье соединение в списке работают, но второе-нет. Я не хочу, чтобы цикл foreach заканчивался на втором соединении, я хочу, чтобы он захватил информацию, которую он может получить от двух рабочих соединений, чтобы сформировать таблицу.


Тогда блок try должен окружать весь код, который его использует, а не только попытку открыть соединение:
foreach (string item in itemList)
    {
    try
        {
        connectionString = string.Format(theString, item); /
        using (SqlConnection sqlConnect = new SqlConnection(connectionString))
            {
            sqlConnect.Open();
            sqlQuery1 = new SqlDataAdapter("my sql query",sqlConnect);
            createTable();
            ...
            }
        }
    catch {} // Ignore connections that don't work: we want the average of the others.
    }


Graeme Cooper

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

Итак, если бы у меня было 3 соединения; первое и третье соединение в списке работают, но второе-нет. Я не хочу, чтобы цикл foreach заканчивался на втором соединении, я хочу, чтобы он захватил информацию, которую он может получить от двух рабочих соединений, чтобы сформировать таблицу.

OriginalGriff

Ответ обновлен.