2011-07-21 82 views
5

estoy desarrollando mi primer Programm y estoy frente a algunos problemas por favor, ayúdame a completarlo tengo este código en C#:No se puede convertir implícitamente el tipo 'objeto' a 'System.DateTime'. existe una conversión explícita (¿falta un yeso?)

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

y el mensaje de error para esto es ............... date_ofbirth = dr ["dateofbirth"];

Error 2 No se puede convertir implícitamente el tipo 'objeto' a 'System.DateTime'. existe una conversión explícita

(¿falta un yeso?)

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

Respuesta

15

Usted debe emitir todo de los que, en lugar de usar ciegamente ToString():

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

Esto "unbox" el valor según sea necesario.

Por supuesto, un enfoque más sencillo es utilizar un ORM o micro-ORM (como "pulcro") -, solo tienes que ejecutar:

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

donde User es una clase con propiedades que coinciden con el definición de tabla, es decir,

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

También; asegúrese de leer sobre using aquí, es decir

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

esto es aún más importante para las conexiones, etc, sino que actúa para asegurar el recurso está correctamente Dispose() d incluso si hay un error. Esto reemplaza el "init como nulo, se establece en nulo al final" código, y tiene la ventaja de hacer algo realmente; p

+0

Poco Gotcha que pasé 15 minutos en: apuesto lanzará el mismo error si la clase no es pública, pero en lugar privado. Un poco oscuro. –

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

o analizar segura:

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

¿Por qué convertir a una cadena y viceversa si es un 'DateTime' debajo? –

+0

Parse o TryParse está esperando una cadena (no un objeto) – kleinohad

+1

De hecho, pero cuando lo que tienes ya es un DateTime, ¡no tiene sentido serializarlo en una cadena antes de analizarlo! Un elenco es suficiente. – Falanwe

0

Usted tendrá que utilizar Convert.ToDateTime en dr["dateofbirth"] y también en dr["idexpirydate"] (Dado que la edad sería intConvert.ToInt32 de edad en caso de que está fallando también!)

lo que se devuelve es de tipo object y usted tendrá que ca Específicamente para el tipo de datos definido, no todos son cadenas por lo que ToString() no será la opción para todos ellos.

También sería bueno para comprobar si hay DBNull en caso que usted no está utilizando los tipos de datos que admiten nulos

2

Al utilizar algo como esto

myVar = dr["myColumnName"]; 

el valor de dr["myColumnName"] es visto por el compilador como un simple objeto .Siempre debe echarlo antes de asignar esa manera:

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