2011-07-21 1 views
5

Je développe mon premier programm et je suis confronté à des problèmes s'il vous plaît aidez-moi terminer je le code en C#:Impossible de convertir implicitement le type 'objet' en 'System.DateTime'. Il existe une conversion explicite (vous manque un casting?)

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; 
} 

et le message d'erreur c'est ............... date_ofbirth = dr ["dateofbirth"]; Erreur 2 Impossible de convertir implicitement le type 'objet' en 'System.DateTime'. Une conversion explicite existe

(vous manque un casting?)

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

Répondre

15

Vous devrait jeter tous de ceux-ci, plutôt que d'utiliser aveuglément ToString():

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

Ce sera « Unbox » la valeur au besoin.

Bien sûr, une approche plus facile est d'utiliser un ORM ou micro-ORM (tels que « pimpant ») - alors vous exécutez simplement:

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

User est une classe avec des propriétés qui correspondent à la définition de table, c'est-à-dire

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

Aussi; assurez-vous que vous lisez sur using ici, à savoir

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

cela est encore plus important pour les connexions etc, mais il agit pour assurer la ressource est correctement Dispose() d, même s'il y a une erreur. Cela remplace votre « init comme nulle, définie sur null à la fin » code, et a l'avantage de faire réellement quelque chose, p

+0

Petit truc que j'ai passé 15 minutes sur: dapper lancera la même erreur si votre classe n'est pas publique, mais privée. Un peu obscur. –

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

ou Parse sécurité:

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

Pourquoi convertir en une chaîne et revenir si c'est un 'DateTime' en dessous? –

+0

Parse ou TryParse attend une chaîne (pas un objet) – kleinohad

+1

En effet, mais quand ce que vous avez est déjà un DateTime en dessous, il est inutile de le sérialiser en une chaîne avant de l'analyser de nouveau! Une distribution est suffisante. – Falanwe

0

Vous devrez utiliser Convert.ToDateTime sur dr["dateofbirth"] et sur dr["idexpirydate"] (Depuis l'âge serait intConvert.ToInt32 pour l'âge en cas qui ne parvient pas trop!)

ce qui est retourné est de type object et vous devrez ca st spécifiquement au DataType défini, tous ne sont pas des chaînes donc ToString() ne sera pas le choix pour tous.

En outre, il serait bon de vérifier DBNull Incase vous n'utilisez pas datatypes nullables

2

Lorsque vous utilisez quelque chose comme ça

myVar = dr["myColumnName"]; 

la valeur de dr["myColumnName"] est vu par le compilateur comme un simple objet .Vous devriez toujours le lancer avant de l'affecter ainsi:

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