无法隐式将类型“object”转换为“System.DateTime”。存在显式转换(是否缺少强制转换?)

6

我正在开发我的第一个程序,遇到了一些问题,请帮助我完成它。以下是我在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

4个回答

23

你应该将所有这些都进行转换,而不是盲目地使用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()。这将取代您的“初始化为null,在结尾处设置为null”的代码,并具有实际执行某些操作的优点 ;p


一个小问题让我花了15分钟的时间:如果你的类不是public,而是private,dapper会抛出相同的错误。有点晦涩。 - Erti-Chris Eelmaa

2
当你使用像这样的东西时。
myVar = dr["myColumnName"];

dr["myColumnName"] 的值在编译器中被视为简单对象。在赋值之前,您应该始终将其转换:

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

0
date_ofbirth = DateTime.Parse(dr["dateofbirth"].ToString());

或安全解析:

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

1
为什么要将其转换为字符串再转回来,如果它本质上是一个 DateTime 类型呢? - Jon Skeet
Parse或TryParse需要一个字符串(而不是对象)。 - kleinohad
1
确实,但是当您已经拥有一个DateTime对象时,将其序列化为字符串再解析回来是没有意义的!进行强制转换就足够了。 - Falanwe

0

您需要在 dr["dateofbirth"]dr["idexpirydate"] 上使用 Convert.ToDateTime(因为年龄可能是 int,如果这也失败了,则使用 Convert.ToInt32)。

返回的类型是 object,您需要将其具体转换为定义的 DataType,不是所有的 DataType 都是字符串,因此 ToString() 不是所有 DataType 的选择。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接