Указанное приведение недопустимо при получении значения столбца данных
Приведенное выше сообщение об ошибке появляется, когда я пытаюсь получить значение столбца из Datatable.
Это то, что я нахожу в трассировке стека:
System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
1 источник)
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
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)
перегрузка, чтобы указать тип данных столбца.