2011-07-21 307 views
5

我发展我的第一个PROGRAMM和现在面临的一些问题,请帮我完成它 我有这样的代码在C#:不能将类型'object'隐式转换为'System.DateTime'。一个显式转换存在(是否缺少强制转换?)

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无法将类型'对象'隐式转换为'System.DateTime'。显式转换存在

(是否缺少强制转换?)

C:\用户\ MICKY \文档\ Visual Studio 2008的\项目\ Godswill \ Godswill \ Personal.cs 249 28 Godswill

回答

15

你根据需要

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

这将“拆箱”的值:应该投那些所有,而不是盲目地使用ToString()

当然,这里有一个更简单的方法是使用ORM或微ORM(如“短小精悍”) - 那么你只要运行:

var user = connection.Query<User>("select * from Users where [email protected]", 
     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”的代码,并有真的在做事情的优势,P

+0

小疑难杂症,我花了上15分钟:如果你的类不是公共的,而是私人短小精悍将抛出同样的错误。有点模糊。 –

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

或安全解析:

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

为什么要转换为字符串,如果它是下面的'DateTime',则返回? –

+0

解析或TryParse期待一个字符串(不是对象) – kleinohad

+1

事实上,但是当你已经有了一个DateTime的时候,在解析它之前没有必要将它序列化成一个字符串!演员阵容就够了。 – Falanwe

0

你将不得不使用Convert.ToDateTimedr["dateofbirth"],也对dr["idexpirydate"](由于年龄将intConvert.ToInt32为年龄在失败过如此!)

返回什么是object型的,你将不得不CA特别是对于定义的数据类型,并不是所有的都是字符串,所以ToString()不会是所有的选择。

而且这将是很好柜面你不使用可空数据类型

2

当你使用这样的

myVar = dr["myColumnName"]; 

dr["myColumnName"]值是由编译器看作是一个简单的对象来检查DBNull 。你总是应该分配给它这种方式前投它:

myVar = (ExpectedType)dr["myColumnName"]; 
相关问题