无法将类型'object'隐式转换为'System.DateTime'。存在显式转换(您是否错过了演员?)

时间:2011-07-21 07:28:56

标签: c# sql

我正在开发我的第一个程序并面临一些问题请帮我完成它 我在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 个答案:

答案 0 :(得分:16)

你应该投射所有,而不是盲目地使用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,在最后设置为null”代码,并且具有实际执行某些操作的优势; p

答案 1 :(得分:2)

当你使用这样的东西时

myVar = dr["myColumnName"];

编译器将dr["myColumnName"]的值视为一个简单对象。你应该在以这种方式分配它之前总是强制转换它:

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

答案 2 :(得分:0)

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

或安全解析:

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

答案 3 :(得分:0)

您必须在Convert.ToDateTimedr["dateofbirth"]上使用dr["idexpirydate"](因为年龄为int Convert.ToInt32,以防万一!)

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

如果您没有使用可以为空的数据类型,那么检查DBNull也是一件好事