2011-07-21 280 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"]; 
相關問題