【问题标题】:Cannot implicitly convert type 'object' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)无法将类型“object”隐式转换为“System.DateTime”。存在显式转换(您是否缺少演员表?)
【发布时间】:2011-10-10 00:02:49
【问题描述】:

我正在开发我的第一个程序,但遇到了一些问题,请帮助我完成它 我在 c# 中有这段代码:

SqlDataReader dr = null;
dr = cmd.ExecuteReader();
if (dr.Read()) 
{
client_id = dr["clientid"].ToString();
surname = dr["surname"].ToString();
othername = dr["othername"].ToString();
gender = dr["gender"].ToString();
date_ofbirth = dr["dateofbirth"];
nationality = dr["nationality"].ToString();
//age = dr["Age"];
residential_address = dr["residentialaddress"].ToString();
postal_address = dr["postaladdress"].ToString();
contact_number = dr["telephonenumber"].ToString();
marital_status = dr["maritalstatus"].ToString();
spouse_name = dr["spousename"].ToString();
email = dr["email"].ToString();
occupation = dr["occupation"].ToString();
typeof_id = dr["typeofid"].ToString();
id_number = dr["idnumber"].ToString();
id_expirydate = dr["idexpirydate"];
remarks = dr["remarks"].ToString();
picture = dr["picture"].ToString();
return true;
cmd.CommandText = null;
}

这个错误信息是...... date_ofbirth = dr["dateofbirth"];

错误 2 无法将类型“object”隐式转换为“System.DateTime”。存在显式转换

(你错过了演员吗?)

C:\Users\MICKY\Documents\Visual Studio 2008\Projects\Godswill\Godswill\Personal.cs 249 28 Godswill

【问题讨论】:

    标签: c# sql


    【解决方案1】:

    你应该全部使用这些,而不是盲目地使用ToString()

    date_ofbirth = (DateTime) dr["dateofbirth"];
    

    这将根据需要“拆箱”该值。

    当然,这里更简单的方法是使用 ORM 或微 ORM(例如“dapper”)——然后你只需运行:

    var user = connection.Query<User>("select * from Users where Id=@id",
             new {id = 123}).First(); // (this is using "dapper")
    

    其中User 是一个具有与表定义匹配的属性的类,即

    public class User {
        public string Surname {get;set;}
        ...
        public DateTime DateOfBirth {get;set;}
    }
    

    还有;确保你在这里阅读了using,即

    using(SqlDataReader dr = cmd.ExecuteReader())
    {
        if (dr.Read()) {...etc...}
    }
    

    这对于连接等更为重要,但它的作用是确保资源正确Dispose()d,即使出现错误也是如此。这将替换您的“init as null,最后设置为 null”代码,并且具有实际做某事的优势;p

    【讨论】:

    • 我花了 15 分钟的小问题:如果你的课程不是公开的,而是私有的,dapper 会抛出同样的错误。有点晦涩。
    【解决方案2】:

    当你使用这样的东西时

    myVar = dr["myColumnName"];
    

    dr["myColumnName"] 的值被编译器视为一个简单对象。您应该始终在以这种方式分配它之前对其进行转换:

    myVar = (ExpectedType)dr["myColumnName"];
    

    【讨论】:

      【解决方案3】:

      您将不得不在dr["dateofbirth"]dr["idexpirydate"] 上使用Convert.ToDateTime(因为年龄将是int Convert.ToInt32,以防万一也失败!)

      返回的是 object 类型,您必须将其专门转换为定义的 DataType,并非所有这些都是字符串,所以 ToString() 不会是所有这些的选择。

      如果您没有使用可空数据类型,最好检查 DBNull

      【讨论】:

        【解决方案4】:
        date_ofbirth = DateTime.Parse(dr["dateofbirth"].ToString());
        

        或安全解析:

        DateTime.TryParse(dr["dateofbirth"].ToString(), out date_ofbirth);
        

        【讨论】:

        • 如果下面是DateTime,为什么要转换成字符串并返回?
        • Parse 或 TryParse 需要一个字符串(不是对象)
        • 确实如此,但是当您拥有的已经是一个 DateTime 下面时,在解析它之前将其序列化为字符串是没有意义的!一个演员就够了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多