2017-03-23 18 views
0

2つのdatetimeフィールドを持つ強力な型付きデータテーブルがあります。テーブルには、SQL Serverのデータが格納されます。 SQL ServerのdatetimeフィールドではNULLを使用できます。 DBへのADO呼び出しで、私はNULLをトラップすることができました。Linqの結果でDateTimeのNullをチェックする構文

しかし、私はデータテーブルに対してLinq呼び出しを行っていますが、datetimeフィールドにNULLをトラップできる構文を見つけることができません。

var results = (from r in dsReleases.dtReleases 
    where r.ReleaseNumber == Convert.ToInt32(theRelease) 
    select r 
).FirstOrDefault(); 

GetTheDeliveryData(results.Delivery.ToString()); 

lbReleaseNumber.Text = results.ReleaseNumber.ToString(); 
lbStartDate.Text = results.StartDate.ToShortDateString(); 
lbEndDate.Text = results.EndDate.ToShortDateString(); 
lbQuantity.Text = results.ReleaseQuantity.ToString(); 
lbStatus.Text = results.Status; 

エラーは、開始日と終了日をラベルフィールドに書き込む際に発生します。 nullのdatetimeフィールドをテストする方法に関する提案はありますか?

私はこれを試しました。

lbStartDate.Text = results.StartDate == null ? "": results.StartDate.ToShortDateString(); 

とテーブルdtReleasesで列 '開始日が' がDBNullである

のエラーを得ました。

だから私はこれを試しました。

lbStartDate.Text = results.StartDate == DBNull.Value ? "": results.StartDate.ToShortDateString(); 

しかし、それはコンパイルされませんが、それはタイプ「のSystem.DateTime」と「System.DBNull」のオペランドに適用することはできません

演算子「==」のエラーが発生します。

この構文はコンパイルされますが、実行中にクラッシュします。

lbStartDate.Text = DBNull.Value.Equals(results.StartDate) ? "": results.StartDate.ToShortDateString(); 

これは、テーブル内の列 '開始日' の値は、バックこのエラーに

を私をリードには 'dtReleases' はDBNullです。あなたのオブジェクト内の

+0

を参照してください。 – Rob

+0

私はあなたが探しているものはvariable = conditionだと信じていますか? ConditionValue:else値;それは構文であり、なぜコンパイルされなかったのでしょうか。 – Niklas

答えて

1

あなたStartDateプロパティは、タイプDateTime?またはNullable<DateTime>であることが必要です。以下のように:

public DateTime? StartDate { get; set; }

0

メッセージはあなたのソリューションを語っている:

をだから私はこれを試してみました。 lbStartDate.Text = results.StartDate == DBNull.Value? "":results.StartDate.ToShortDateString();

コンパイルされず、 "Operator '=='は 'System.DateTime'および 'System.DBNull'のオペランドに適用できません。

results.StartDateはnull可能でないdatetimeであるため、動作しません。そのため、常に値を設定する必要があります。これはオプションではありません(ヌル入力可能)。しかし、それをDBNullと比較しようとしているので、コンパイラはその方法を知らないと不平を言っています。 results.StartDateをnullにすると正常に動作します。

+0

ヨシ、私はまだlinqを学んでいます。 results.StartDateをnullにするにはどうすればよいですか? –

+0

'public DateTime? StartDate {get;セット; }疑問符は省略表現です。またはあなたは 'public Nullableを行うことができます StartDate {get;セット; } ' – CodingYoshi

0

DtReleasesのコレクションの種類を指定していません。結果は、DtReleases内の任意の要素と同じ型になります。

DtReleasesの定義を見ると、DtReleasesのすべての要素がStartDateプロパティを含む型のオブジェクトであることがわかります。

StartDateはおそらくDateTimeかDateTimeのいずれかですか? (代替:Nullable<DateTime>

それは本当に日時である場合、あなたはあなたのクエリが実行時に動作するかどうか、あなたの結果は日時が含まれていることを保証することができます

それはDateTimeのであれば、あなたはそれが価値があるかどうかを確認する必要があります。? 。

lbStartDate.Text = results.StartDate?.ToShortDateString(); 
:C#の新しいバージョンは、このための速記を持っ

if (results.StartDate.HasValue) 
{ 
    lbStartDate.Text = results.StartData.Value.ToShortDateString(); 
} 
else 
{ 
    lsStartDate.Text = null; 
} 

:かどうか、それを使用する前に、すべてのNULL可能なタイプは、プロパティhasValueはと価値を持っています

開始日に値がある場合、式の結果はこの値ToShortDateStringになります。そうでなければ、式の結果はnullになります。

は*列がNULL可能であることを示しても、*カラムは、データベース内のNULL可能である場合、あなたはあなたのモデルを持っている必要がありC# Null Conditional Operator

+0

"DtReleasesのコレクションの種類を指定していませんでした。これは、データセットの型付きデータテーブルです。 –

+0

はい、ですが、StartDateがDateTimeかnull可能なDateTimeかどうかはわかりませんが、これは問題の診断に重要です –

関連する問題