Ошибка набора данных Linq To System.InvalidCastException: указанное приведение недопустимо - PullRequest
2 голосов
/ 07 декабря 2011

Я получаю следующее исключение, используя Linq для набора данных "System.InvalidCastException: указанное приведение недопустимо."

Проблема в следующем: у меня есть модель с двумя значениями типа int ?. Значения в базе данных не являются обязательными, поэтому некоторые поля являются пустыми. Я прочитал таблицу в набор данных, и теперь мне нужно запросить набор данных, используя следующий код.

//model
public class Model
{
    // Public Properties
    ...
    ...
    ...
    public int? YearBegin { get; set; }
    public int? YearEnd { get; set; }
}

//query
var list = from m in data.Tables["Models"].AsEnumerable()
select new Model
{
   // rest of members omitted to simplify
   YearBegin = m.Field<int>("YearBegin"), 
   YearEnd =   m.Field<int>("YearEnd") 
};

Я пробовал следующее ни один не работал:

m.Field<int?>("YearBegin")
YearEnd = m.IsNull("YearEnd") ? null, m.Field<int>("YearEnd")

Есть ли другой способ проверить, имеет ли поле значение, подобное String.IsNullOrEmpty (). Использование строки в качестве типа невозможно ...

Спасибо

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Вы не используете типизированный DataSet, поэтому мой первый вопрос будет таков: знает ли DataTable, что эти поля должны быть int? во-первых, или они перечислены как строки? Если DataTable обрабатывает эти поля как строки, вы увидите эту ошибку. В следующем коде предполагается набор данных TestData с набором данных Models, с двумя строковыми столбцами, которые могут иметь значение NULL и YearEnd:

using (TestData ds = new TestData())
{
      // Typed Rows
      ds.Models.AddModelsRow("1", "2");
      ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST
      // Untyped rows
      DataRow r = ds.Models.NewRow();
      r[0] = "4";
      r[1] = "5";
      ds.Models.Rows.Add(r);


      //query
      var list = from m in ds.Tables["Models"].AsEnumerable()
                 select new Model
                 {
                     // rest of members omitted to simplify
                     YearBegin = m.Field<int?>("YearBegin"),
                     YearEnd = m.Field<int?>("YearEnd"),
                 };
}

В этом коде возникнет исключение InvalidCastException. Однако, когда я переворачиваю типы в DataTable на обнуляемый Int32, почти идентичный код работает правильно:

using (TestData ds = new TestData())
{
      // Typed Rows
      ds.Models.AddModelsRow(1, 2);
      ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST
      // Untyped rows
      DataRow r = ds.Models.NewRow();
      r[0] = 4;
      r[1] = 5;
      ds.Models.Rows.Add(r);


      //query
      var list = from m in ds.Tables["Models"].AsEnumerable()
                 select new Model
                 {
                     // rest of members omitted to simplify
                     YearBegin = m.Field<int?>("YearBegin"),
                     YearEnd = m.Field<int?>("YearEnd"),
                 };
}

Посмотрите на свой DataTable. Вы можете исправить свою проблему там. Поле приведено к int? не будет работать, если ваше поле DataTable не совпадает с int? тип.

0 голосов
/ 08 декабря 2011

Проблема решена, я работаю с устаревшей базой данных доступа, а тип данных был сохранен как Integer вместо Long Integer, то есть он представлен как Int16 в наборе данных, отсюда исключение Invalid cast ...

...