Не удается неявно преобразовать тип «объект» в «System.DateTime».Существует явное преобразование (вам не хватает приведения?) - PullRequest
5 голосов
/ 21 июля 2011

Я занимаюсь разработкой своей первой программы и столкнулся с некоторыми проблемами, пожалуйста, помогите мне завершить ее У меня есть этот код в 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 Не удается неявно преобразовать тип «объект» в «System.DateTime». Существует явное преобразование

(вам не хватает актеров?)

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

Ответы [ 4 ]

17 голосов
/ 21 июля 2011

Вы должны разыграть всех из них, а не вслепую, используя 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 в конце" и имеет преимущество в том, что он действительно что-то делает; p

2 голосов
/ 21 июля 2011

Когда вы используете что-то подобное

myVar = dr["myColumnName"];

, значение dr["myColumnName"] рассматривается компилятором как простой объект.Вы должны всегда разыгрывать его, прежде чем назначить его таким образом:

myVar = (ExpectedType)dr["myColumnName"];
0 голосов
/ 21 июля 2011

Вам придется использовать Convert.ToDateTime на dr["dateofbirth"], а также на dr["idexpirydate"] (поскольку возраст будет int Convert.ToInt32 для возраста в случае, если он тоже не работает!)

Что такоевозвращается тип object, и вам нужно будет привести его к определенному типу DataType, не все из них являются строками, поэтому ToString() не будет выбором для всех из них.

Также это будетхорошо бы проверить DBNull, если вы не используете nullable типы данных

0 голосов
/ 21 июля 2011
date_ofbirth = DateTime.Parse(dr["dateofbirth"].ToString());

или безопасный анализ:

DateTime.TryParse(dr["dateofbirth"].ToString(), out date_ofbirth);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...