2012-11-25 13 views
9

olarak kullanılacak DateTime için bir boş nesneyi ayrıştırma nasıl yönetilir İki DateTime nesnesi var, BirthDate ve HireDate. Onlar bir dize olarak doğru biçimde biçimlendirilmişlerdir ve bunları veri erişim katmanımma aktardığımda, bunların bir DateTime nesnesine ayrıştırılması gerekir.ADN.NET ile DBNULL

DateTime hD = DateTime.Parse(hire);    
DateTime bD = DateTime.Parse(birth); 

//incase of a datestring being passed through 
dateStringPassed = "7/2/1969"; 

Fakat bazen dizeleri hire ve birth kodu şöyle çalıştırılırsa, bir boş bir dize Ayrıştırma gelen FormatException hatası alıyorum, null veya "" boştur. Boş ayrıştırmaları nasıl yönetebilirim ve boşsa veya boşsa, DateTime izin ver DBNull.Value olarak kabul edilebilir mi?

Kullanıcının bir DateTime dizesinden geçmemesi durumunda yönetemiyorum, daha sonra ayrıştırma kodumu çöker.

Doğum tarihi için parametrem şu şekildedir ve boşsa, değişkeni denetler ve DBNull.Value değerini kullanır.

cevap

2

nullable tarih saatlerini kullanmanız gerekir - kısayol sözdizimi DateTime? olur (en sonunda ? not edin). bunun yerine DbNull.Value kullanmıyorsa

DateTime? hD = null; 
if(!string.IsNullOrWhitespace(hire)) // string.IsNullOrEmpty if on .NET pre 4.0 
{ 
    hD = DateTime.Parse(hire);    
} 

Sen hD.HasValue için test edebilirsiniz.

+0

DateTime bD = DateTime.Parse (birth) ile bir örnek yazabilir misiniz? Sonunda da '' 'kullanacak, ayrıca bir“ int ”için mi çalışacaksınız? – GivenPie

+0

@GivenPie - Evet, bir "int" ve herhangi bir değer türü için olurdu. – Oded

+0

Serin, teşekkürler Oded! – GivenPie

9

Parse yöntem boş dizeleri işleyemez, ancak null DateTime kullanmak ve böyle bir şey yapabilirsiniz:

DateTime? hD = String.IsNullOrEmpty(hire) ? (DateTime?)null : DateTime.Parse(hire) 

Ama daha da güvenli yerine TryParse kullanarak olurdu: Sonra

DateTime? hD = null; 
DateTime.TryParse(hire, out hD); 

Bu değeri depolamak için, :


C# 7 olduğundan, satır içi dışarı parametreleri için daha kısa sözdizimi kullanabilir ve tamamen null türü önleyebilirsiniz: Bu yöntemi, herhangi bir şey kullanın

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ } 
else { /* use DBNull.Value */ } 
+1

Ben bu satırı derlemek için bu üçlü operatörde' null '' i atacağınıza inanıyorum. ':' Nin her iki tarafı, aralarında örtülü dönüşümleri olan aynı türde veya türlerde olmalıdır. – Oded

+0

Haklısınız, cevabımı düzenleyeceğim. –

+1

Ve bu son satır - Bunu nasıl yazabileceğinizi göremiyorum, böylece derleyici bunu kabul edebilir. – Oded

0

değil doğru tarih bir dönecektir DBNull.Value:

/// <summary> 
/// Parses a date string and returns 
/// a DateTime if it is a valid date, 
/// if not returns DBNull.Value 
/// </summary> 
/// <param name="date">Date string</param> 
/// <returns>DateTime or DBNull.Value</returns> 
public static object CreateDBDateTime(string date) 
{ 
    DateTime result; 
    if (DateTime.TryParse(date, out result)) 
    { 
     return result; 
    } 
    return DBNull.Value; 
} 
İlgili konular