【问题标题】:Specified cast is not valid when getting Datatable Column Value获取数据表列值时指定的强制转换无效
【发布时间】:2012-05-22 13:33:49
【问题描述】:

当我尝试从数据表中获取列值时出现上述错误消息。

这是我在堆栈跟踪中找到的:

System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1 来源)

 and this in the TargetSite when debugging:

{ 布尔 b__0(System.Data.DataRow)}

这是我的代码: 数据表 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);

我哪里做错了,如果有人可以告诉我。

【问题讨论】:

    标签: c# .net web-services datatable datarow


    【解决方案1】:

    检查您的代码,前两行:

    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 那么 .ToString 将给出错误“Specified cost.......”

    在转换为日期时间时也会发生同样的情况。

    【讨论】:

      【解决方案2】:

      如果 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();
      

      【讨论】:

        【解决方案3】:

        当您使用Add(string) 重载创建数据列时,该列的类型为string(请参阅http://msdn.microsoft.com/en-us/library/52xzw8tf.aspx)。您不能将字符串直接转换为 Int64DateTime

        使用Add(string, Type) 重载或Add(string, Type, string) 重载来指定列数据的类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-08
          • 1970-01-01
          • 2018-05-27
          • 2014-07-30
          相关资源
          最近更新 更多