【问题标题】:Unable to cast object of type 'System.Object[]' to type 'System.IConvertible' how to deal with this error?无法将“System.Object[]”类型的对象转换为“System.IConvertible”类型如何处理此错误?
【发布时间】:2012-03-11 17:28:01
【问题描述】:
 string dt = "SELECT Last_login,SnapNo,Membership from [User] where FB_Id='" + uid1 + "'";
    da = new SqlDataAdapter(dt, con);
    ds1 = new DataSet();
    da.Fill(ds1);

    DateTime dt1 = Convert.ToDateTime(ds1.Tables[0].Rows[0].ItemArray);

    Int32 snapno = Convert.ToInt32(ds1.Tables[0].Columns["Last_login"]);
    string membership = ds1.Tables[0].Rows[2].ItemArray.ToString();
    DateTime dt2 = DateTime.Now;

我的代码如下,我无法解决这个问题

请帮忙

【问题讨论】:

  • 您为什么要尝试将数组转换为DateTime?我猜你的错误发生在DateTime dt1 = Convert.ToDateTime(ds1.Tables[0].Rows[0].ItemArray);,对吧?
  • 你的代码没有任何意义。
  • M Babcock 是的,错误只会出现在那里..@Andre 也尝试过..没有成功
  • 你是怎么想到这个代码的?你期待ItemArray 会做出怎样的魔法?
  • 我的问题已经解决了

标签: c# asp.net .net exception


【解决方案1】:

很难理解您的代码应该做什么,而且您似乎不明白RowsColumnsItemArray 的含义。您可能应该阅读他们的文档。

认为你正在尝试做的是这样的:

var row = ds1.Tables[0].Rows[0];

DateTime lastLogin = (DateTime)row["Last_login"];
Int32 snapno = (Int32)row["snapno"];
string membership = (string)row["membership"]:

【讨论】:

    【解决方案2】:

    我的代码如下,我无法解决这个问题”:您是否尝试使用调试器?异常发生在哪一行?这个问题并没有真正表明您要尝试自己解决问题。

    不管怎样,信息有限,我来猜测一下解决方案:

    ds1.Tables[0].Rows[0].ItemArray 是行中所有项目的数组。您不能将其转换为日期时间。您可能想要:

    DateTime dt1 = Convert.ToDateTime(ds1.Tables[0].Rows[0]["Last_login"];
    

    顺便说一句,you really should use parameterized SQL queries

    【讨论】:

      【解决方案3】:

      ItemArray 返回一个对象数组。 DateTime 存储单个值。您希望转换做什么?

      如果对象数组包含日期,那么你可以这样做

      using system.Linq;
      
      ...
      
      DateTime[] dates = ds1.Tables[0].Rows[0].ItemArray.Cast<DateTime>().ToArray();
      

      如果你只需要一次约会

      DateTime dt1 = (DateTime)ds1.Tables[0].Rows[0]["DateColumn"];    
      

      其中"DateColumn" 是表列的名称。

      【讨论】:

        【解决方案4】:
        DateTime dt1 = Convert.ToDateTime(ds1.Tables[0].Rows[0].ItemArray);
        

        这实际上没有意义,因为DataRow 类型的ItemArray 属性返回一个object[](从名称上应该很明显)。您需要先获取字段,例如字符串,然后才能执行此操作,如下所示:

        DateTime dt1 = Convert.ToDateTime(ds1.Tables[0].Rows[0]["Last_login"]);
        

        发生了您看到的异常,因为 Convert 类的所有转换器方法都使用 IConvertible 对象(即其类型实现该接口的对象)。通常只有最原始的类型实现这个接口,比如 string、int 和 DateTime。这是因为将这些类型的值相互转换通常是有意义的。

        如果你想一想,你会发现对象数组和 DateTime 类型之间没有这种共同的联系,这就是你得到异常的原因。

        我想建议您在来这里寻求帮助之前先尝试自己解决问题。通过这种方式,您可以学到更多东西,从长远来看,这会让您更有效率。

        对于初学者,我建议您阅读有关 IConvertible 接口和 Convert 类的 msdn 文档。

        【讨论】:

          【解决方案5】:
          Convert.ToDateTime(IConvertible);
          

          IConvertible 是一个接口,该函数内部的任何东西都必须实现。 您的 SQL 调用返回的对象数组不实现 ICOnvertible,因此不能用作参数。

          把它想象成试图像这样调用一个函数:

          private void DoSomething(String input)
          

          通过使用

          DoSomething(999);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-17
            • 2012-03-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多