Member 13049972 Ответов: 3

Обработка исключений не работает


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

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

//Search from Student table in srsjason database //BY ID//
        public Student SearchbyID(string sid)
        {

            Student SOB = new Student();
            try
            {
                string sql = "select * from Student where Student_ID = '" + sid + "' ";
                SqlCommand cmd = new SqlCommand(sql, m_con);
                m_con.Open();

                SqlDataReader dreader = cmd.ExecuteReader();
                if (dreader.Read())
                {
                    SOB.setStudentID(dreader[0].ToString());
                    SOB.setTitle(dreader[1].ToString());
                    SOB.setFulname(dreader[2].ToString());
                    SOB.setAddress(dreader[3].ToString());
                    SOB.setContact(Convert.ToInt32(dreader[4].ToString()));         //Int
                    SOB.setemail(dreader[5].ToString());
                    SOB.setDOB(Convert.ToDateTime(dreader[6].ToString()));          //DateTime
                    SOB.setUN(dreader[7].ToString());
                    SOB.setPW(dreader[8].ToString());
                }
                else
                {
                    SOB.setStudentID(null);
                }
                dreader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(" No Student Record Found!!");
            }
            finally
            {
                m_con.Close();
            }
            return SOB;
        }

F-ES Sitecore

Как вы думаете, где будет выброшено исключение, если ничего не существует?

Кроме того, что делать, если открытие соединения вызывает исключение? Вы попытаетесь закрыть его в последнем блоке.

Используйте отладчик для пошагового просмотра кода, чтобы узнать, что он делает. Если вы хотите получить сообщение, когда ничего не найдено, то поместите его в раздел "else" для "if (dreader. Read())"

Member 13049972

не могли бы вы показать мне, как доработать код?

F-ES Sitecore

Что-то вроде

конструкторы нашли = ложь;
Студенческий всхлип = новый студент();
пробовать
{
string sql = " select * from Student where Student_ID = '" + sid + "' ";
SqlCommand cmd = new SqlCommand(sql, m_con);
m_con.Открыть();

SqlDataReader dreader = cmd.Метода executereader();
если (dreader. Read())
{
нашли = истина;

Соб.setStudentID(dreader[0].Метод toString());
SOB. setTitle (dreader[1].Метод toString());
Соб.setFulname(dreader[2].Метод toString());
SOB. setAddress(dreader[3].Метод toString());
Соб.setContact(конвертировать.ToInt32 (dreader[4].ToString ())); / / Int
SOB. setemail(dreader[5].Метод toString());
Соб.setDOB(конвертировать.ToDateTime (dreader[6].ToString ())); / / DateTime
Соб.Сетунь(dreader[7].Метод toString());
SOB. setPW (dreader[8].Метод toString());
}
ещё
{
Соб.setStudentID(нуль);
}
дредер.Закрывать();
}
поймать (исключение бывший)
{
Ящик для сообщений.Show ("Ошибка");
}
наконец
{
m_con.Закрывать();
}

если (! найдено)
{
Ящик для сообщений.Показать ("Запись Студента Не Найдена!!");
}

ответный всхлип;



Однако в идеале все, что вызывает SearchbyID, должно показывать сообщение, и вы должны сделать так, чтобы SearchbyID возвращал null, если ничего не найдено.

Bryian Tan

Приятно!!! Я думаю, что это должно сделать это.

3 Ответов

Рейтинг:
2

Patrice T

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

SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Рейтинг:
1

ZurdoDev

После вашего звонка в ЦМД.ExecuteReader() вы бы сделали что-то вроде этого:

try{
....
  dreader = cmd.ExecuteReader();
  if (dreader.HasRows){
    dreader.Read();
    ...
  }
  else
  {
   // no record found.  HasRows = false
  }
}
catch (SqlException sqlEx){
 // do something
}
catch (Exception ex){
...
}


Рейтинг:
0

Richard MacCutchan

Это происходит потому, что команда не создает исключения, кроме как по причинам, перечисленным в документации: Свойство sqlcommand.Метод ExecuteReader (System. Data.SqlClient)[^] .


Member 13049972

ты можешь показать мне, как это делается?

Richard MacCutchan

Как что делать? Если вызов библиотеки не вызывает исключения, то ловить нечего. Вернитесь назад и внимательно прочитайте документацию, особенно объяснения исключений, которые мочь быть брошенным.