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

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

Это то, что я нахожу в трассировке стека:

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);

Где я ошибся, если кто-то может сказать мне, пожалуйста.

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 равен нулю тогда??? вы пытаетесь преобразовать его в строку, а затем в дату и время

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

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

Если 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();

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

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

Другие вопросы по тегам