c#
  • .net
  • exception
  • system.data
  • 2015-12-15 4 views 0 likes 
    0

    Я использую System.Data.DataView.RowFilter для фильтрации таблицы. У меня есть столбец "Time" с DateTime типом данных и для этого столбца Я использую следующий фильтр:Ожидаемое исключение не выбрасывается, когда DataView.RowFilter настроен на неправильный фильтр

    < Время = '15 .12.2015 11: 38: 03,000'

    Но случайно я неправильно набранной точки, что отделяет секунды и миллисекунды, а вместо этого набрал в точку с запятой:

    < Время = '15 .12.2015 11: 38: 03: 000' .

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

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

    Код:

    var dt = new DataTable(); 
    var col = dt.Columns.Add("Time"); 
    col.DataType = typeof(DateTime); 
    var row = dt.NewRow(); 
    row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000"); 
    dt.Rows.Add(row); 
    dt.Rows.Count.Dump(); 
    dt.DefaultView.RowFilter="Time<= '15.12.2015 11:38:03.000'"; // Ok. 
    dt.DefaultView.RowFilter="Time<= '15.12.2015 11:38:03:000'"; // Evaluation Exception. 
    

    Я проверил несколько раз, и в моем проекте:

    • Это исключение не выдается.
    • RowFilter равен "Time<= '15.12.2015 11:38:03:000'" после экзаменации.
    • Выполнение кода продолжается, как и при использовании правильного выражения фильтра.

    Я думал, что это может быть ошибка 4.0. 4.0 4.0 и установить для него среду моего тестового приложения. Тот же результат: он выдает исключение, но не исключение в проекте.

    В тестовом приложении исключение выбрано даже без отладки в сборке релизов, поэтому оно не зависит от настроек отладчика.

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

    Я запускаю оба проекта и тестовое приложение на одном ПК.

    Вот скриншот отладки с следующим шагом после того, как RowFilter значения было установлено в некорректный фильтр и принять его без исключения: Incorrect filtes is successfuly set.

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

    +0

    Вы уверены, что в программе нет «try ... catch» блоков, которые ловят исключение? – Matthew

    +0

    @Matthew да, есть, но это не имеет значения. Посмотрите на скриншот, выполнение переходит к следующей строке и примененному фильтру. – CodingFeles

    ответ

    2

    я тестирование кода и, кажется, что фильтр не проверяется, если нет строки в DataTable
    этот код работает

    var dt = new DataTable(); 
          var col = dt.Columns.Add("Time"); 
          col.DataType = typeof(DateTime); 
          //var row = dt.NewRow(); 
          //row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000"); 
          //dt.Rows.Add(row); 
          dt.DefaultView.RowFilter = "Time<= '15.12.2015 11:38:03.000'"; 
          dt.DefaultView.RowFilter = "Time<= '15.12.2015 11:38:03:000'"; 
    

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

    var row = dt.NewRow(); 
    row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000"); 
    dt.Rows.Add(row); //this will generate an error 
    

    Ошибка «не удается выполнить„< =“операция о п System.DateTime и System.String «

    поэтому фильтр не выполняется, когда DataTable пуст

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

    +0

    Спасибо! Смешно, в моей строке проекта добавлено тоже. Я решил скрыть некоторые части кода от скриншота и удалил добавив пустую строку перед настройкой фильтра, и даже с строкой она не выбрала исключение. Но это действительно так, и вы правы! Моя строка была пуста, и после того, как я установил значение «Время», как и вы, было исключено исключение. Кроме того, я тестировал случай, когда 'Time' пуст, а другой столбец установлен - исключение не выбрасывается. Итак, чтобы фильтр был протестирован, таблица должна иметь некоторые значения в столбцах, которые использовались в фильтре. Я предлагаю вам обновить свой ответ с помощью этой информации. – CodingFeles

     Смежные вопросы

    • Нет связанных вопросов^_^