我有一个LINQ语句来检查是否有人输入了凭证兑换的URL。我获得此优惠券的方式是使用常规网址,并使用额外的哈希值CampaignID,即名为my VoucherRedemption,如下所示。
if (Request.QueryString["voucherRedemption"] != null)
{
String VoucherRemption = Request.QueryString["voucherRedemption"];
MSCDatabaseDataContext MSCDB2 = new MSCDatabaseDataContext();
var getCampaign = from campaign in MSCDB2.Tbl_Campaigns
where campaign.Link.Contains(VoucherRemption)
select campaign;
var VoucherCampaign = getCampaign.FirstOrDefault();
campaignName.Value = VoucherCampaign.CampaignName;
campaignDescription.Value = VoucherCampaign.CampaignDescription;
txtStartDate.Text = VoucherCampaign.StartDate.ToString();
txtDateEnd.Text = VoucherCampaign.EndDate.ToString();
campaignAudience.Value = VoucherCampaign.Target.ToString();
txtDiscount.Text = VoucherCampaign.Discount.ToString();
txtTsCs.Text = VoucherCampaign.TermsConditions;
txtTsCs.ReadOnly = true;
CalendarExtender1.Enabled = false;
CalendarExtender2.Enabled = false;
txtStartDate.ReadOnly = true;
txtDateEnd.ReadOnly = true;
txtDiscount.ReadOnly = true;
txtEmail.Visible = true;
}
现在我不断得到:
System.NullReferenceException:未将对象引用设置为对象的实例。
但奇怪的是,昨天它正在发挥作用。但只是昨天。其他日子也没有。不是它再次被打破。有什么方法可以解决这个问题吗?
编辑:我查了那篇文章,似乎仍然无法找到问题所在。它昨天工作了
答案 0 :(得分:1)
之后没有空检查
var VoucherCampaign = getCampaign.FirstOrDefault();
这非常危险,因为它可以随时返回默认值(也就是null)。数据库连接可能已失败,您有超时,您的查询没有结果,或者您根本不允许访问数据库。当您尝试使用voucherCampaign时,所有这些都会导致空指针。尝试将其更改为以下内容:
var VoucherCampaign = getCampaign.FirstOrDefault();
if (VoucherCampaign == null) {
//print a error message here so you know soemthing is wrong
return;
}
//rest of your code
它无法解决您获得null的原因。但至少你的应用程序不会在此函数中的空指针上崩溃。如果你想知道为什么你没有得到一个返回更改firstrodefault到第一个并尝试捕获它。 catch块中的异常将包含有关查询无效的原因的更多信息。