2011-07-21 11 views
5

私は私の最初のプログラムの開発を開発していますし、いくつかの問題に直面しています私はC#で、このコードを持って、私はそれを を完了助けてください:'オブジェクト'を '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」に暗黙的に変換できません。プロジェクト\ Godswill \ Godswill \ Personal.cs \ Visual Studioの2008 \ \ Users \ユーザーMICKY \ドキュメント249 28 Godswill

答えて

15

ます:明示的な変換は(?あなたはキャストが欠落している)

Cを

が存在しますむしろ盲目的ToString()を使用するよりも、それらのすべてをキャストする必要があります。

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

この意志「VHS版」の値を必要に応じて。もちろん

が、ここで簡単にアプローチがORMか(例えば、「Dapperの」など)のマイクロORMを使用することです - あなただけの実行:Userが一致してプロパティを持つクラスがある

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

をテーブル定義、また、すなわち

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

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

つまり、あなたはここについてusingを読んで確認して、これはさらに重要な接続などのためであるが、それは、リソースがエラーがあっても正しくDispose() Dであることを確認するように作用します。これは、コードあなたの「最後にnullに設定され、ヌルとしてこのinitを、」置き換え、実際に何かをすることの利点がある; pは

+0

私は15分を過ごしました。小さなクラスはあなたのクラスがパブリックではなくプライベートでない場合、同じエラーをスローします。少し不明瞭。 –

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

や安全解析:

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

なぜ文字列に変換し、その下の 'DateTime'ですか? –

+0

ParseまたはTryParseは文字列(オブジェクトではない)を期待しています – kleinohad

+1

確かに、あなたが持っているものがすでに下にあるDateTimeの場合、それを解析する前に文字列にシリアル化する必要はありません!キャストは十分です。 – Falanwe

0

は、あなたが使用する必要があります(年齢があまりにも失敗している場合には年齢のためにintConvert.ToInt32だろうので!)dr["dateofbirth"]にもdr["idexpirydate"]Convert.ToDateTime

何が返されることはタイプobjectのものであり、あなたがCAになります定義されたDataTypeに特定のものが含まれていて、すべてが文字列であるわけではないので、ToString()はそれらすべての選択肢にはなりません。

また、あなたがこの

myVar = dr["myColumnName"]; 

のようなものを使用する場合dr["myColumnName"]の値は、単純なオブジェクトとして、コンパイラによって見られているNULL可能なデータ型に

2

を使用していない包みDBNullをチェックするために良いでしょう。

myVar = (ExpectedType)dr["myColumnName"]; 
関連する問題

 関連する問題