Указанное приведение недопустимо при получении значения столбца Datatable

Приведенное выше сообщение об ошибке появляется, когда я пытаюсь получить значение столбца из Datatable.

Вот что я нахожу в stacktrace:

System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1 источник)

 and this in the TargetSite when debugging:

{Boolean b__0 (System.Data.DataRow)}

Вот мой код: DataTable hr = new DataTable ();

            hr.Columns.Add("BookingDate");
            hr.Columns.Add("BookingId");
            hr.Columns.Add("BookingSource");
            hr.Columns.Add("CheckInDate");
            hr.Columns.Add("CheckOutDate");


            for (int i = 0; i < gmisc.GetModifiedBookings(gmoreq).Bookings.Length; i++)
            {
                hr.Rows.Add();
                hr.Rows[i]["BookingDate"] = Convert.ToDateTime(gmisc.GetModifiedBookings(gmoreq).Bookings[i].BookingDate.ToString());
                hr.Rows[i]["BookingId"] = Convert.ToInt64(gmisc.GetModifiedBookings(gmoreq).Bookings[i].BookingId.ToString());
                hr.Rows[i]["BookingSource"] = gmisc.GetModifiedBookings(gmoreq).Bookings[i].BookingSource.ToString();
                hr.Rows[i]["CheckInDate"] = Convert.ToDateTime(gmisc.GetModifiedBookings(gmoreq).Bookings[i].CheckInDate.ToString());
                hr.Rows[i]["CheckOutDate"] = Convert.ToDateTime(gmisc.GetModifiedBookings(gmoreq).Bookings[i].CheckOutDate.ToString());



            }
            Int64 BookingId = (from DataRow dr in hr.Rows
                          where (Int64)dr["BookingId"] == BookId
                          select (Int64)dr["BookingId"]).FirstOrDefault();
                TextBox1.Text = Convert.ToString(BookingId);

Где я ошибся, подскажите, пожалуйста.


person user1270384    schedule 15.05.2012    source источник


Ответы (3)


Проверьте свой код, первые две строчки:

hr.Rows[i]["BookingDate"] = Convert.ToDateTime(gmisc.GetModifiedBookings(gmoreq).Bookings[i].BookingDate.ToString());
hr.Rows[i]["BookingId"] = Convert.ToInt64(gmisc.GetModifiedBookings(gmoreq).Bookings[i].BookingId.ToString());

если gmisc.GetModifiedBookings (gmoreq) .Bookings [i] .BookingDate имеет значение null, тогда ??? вы пытаетесь преобразовать его в строку, а затем в datetime

если null, то .ToString выдаст ошибку «Указанная стоимость .......»

и то же самое произойдет во время преобразования в datetime.

person Ali Adravi    schedule 15.05.2012

Если dr ["BookingId"] никогда не является нулевым (в противном случае добавьте нулевую проверку)

Использовать

                  Int64 BookingId = (from DataRow dr in hr.Rows
                        where Int64.Parse(dr["BookingId"].ToString()) ==BookId
                        select Int64.Parse(dr["BookingId"].ToString())).FirstOrDefault();

Вместо того

                  Int64 BookingId = (from DataRow dr in hr.Rows
                      where (Int64)dr["BookingId"] == BookId
                      select (Int64)dr["BookingId"]).FirstOrDefault();
person Tilak    schedule 15.05.2012

Когда вы создаете столбец данных с помощью перегрузки Add(string), тип столбца - string (см. http://msdn.microsoft.com/en-us/library/52xzw8tf.aspx). Вы не можете преобразовать строку непосредственно в Int64 или DateTime.

Используйте перегрузку Add(string, Type) или _ 6_, чтобы указать тип данных столбца.

person phoog    schedule 15.05.2012