我有一个带有两个日期时间字段的强类型数据表。该表填充了SQL Server的数据。 SQL Server中的日期时间字段允许空值。在对DB的ADO调用中,我能够捕获空值。
但是现在我正在对数据表进行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;
错误在于将开始日期和结束日期写入标签字段。有关如何测试该datetime字段为null的任何建议吗?
我试过了;
lbStartDate.Text = results.StartDate == null ? "": results.StartDate.ToShortDateString();
并收到错误
表dtReleases中的“StartDate”列是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'中'StartDate'列的值是DBNull。
答案 0 :(得分:1)
对象中的StartDate
属性需要是DateTime?
或Nullable<DateTime>
类型。如:
public DateTime? StartDate { get; set; }
答案 1 :(得分:0)
该消息告诉您解决方案:
所以我尝试了这个; lbStartDate.Text = results.StartDate == DBNull.Value? &#34;&#34 ;: results.StartDate.ToShortDateString();
但是这不会编译,它会给出错误&#34;运算符&#39; ==&#39;不能应用于类型&#39; System.DateTime&#39;的操作数。和&#39; System.DBNull&#39;。&#34;
它不起作用,因为results.StartDate
是一个不可为空的日期时间,因此它必须始终具有值。它不是可选的(可空)。但是你试图将它与DBNull
进行比较,因此编译器抱怨它不知道如何做到这一点。使results.StartDate
可以为空,它会起作用。
答案 2 :(得分:0)
您没有指定DtReleases的收集类型。结果将与DtReleases中的任何元素具有相同的类型。
如果你看一下DtReleases的定义,你会发现DtReleases中的每个元素都是一个包含属性StartDate的类型的对象。
StartDate可能是DateTime还是DateTime? (替代方案:Nullable<DateTime>
如果它确实是DateTime,您可以放心,如果您的查询在运行时工作,您的结果将包含DateTime。
如果是DateTime?你应该在使用它之前检查它是否有值。每个可空类型都具有属性HasValue和Value:
if (results.StartDate.HasValue)
{
lbStartDate.Text = results.StartData.Value.ToShortDateString();
}
else
{
lsStartDate.Text = null;
}
新版本的C#有一个简写:
lbStartDate.Text = results.StartDate?.ToShortDateString();
如果开始日期有值,则表达式的结果将为此值ToShortDateString。否则表达式的结果将为null。