【问题标题】:Nullreference excpetion was unhandled (Object reference not set to an instance of an object)Nullreferenceexception 未处理(对象引用未设置为对象的实例)
【发布时间】:2011-09-15 18:21:43
【问题描述】:

我有一个包含四个组合的表格,例如 cbmefrom(age from ) cbmeto(age to) cbperiod(periodtype values liek this "Next 7 Days" ......) 和 cbgender(cbgender)..

我也有一个数据网格视图(dgvreports)..

我要做的是填充年龄在 20 到 40 岁之间且会员资格将在接下来的 8 天或 24 天或类似情况下到期的会员详细信息...

为此,我编写了一个我在下面指定的类...

 public static string ConvertGender(string Gender)
 {
     switch (Gender)
     {
         case "Male": return "M";
         case "Female": return "F";
         default: return "";
     }
 }
public BindingSource getmebershipexpirymembers(string gender , DateTime strtdate,DateTime enddate,DateTime min , DateTime max)
{
    bs2.DataSource = null;
    var membersreports = from report in eclipse.members
                        let dob= eclipse.members.Take(1).Select(x=>report.member_Dob).Cast<DateTime>().FirstOrDefault()
                        let strtdatees = eclipse.membertomships.Take(1).Select(x=>x.memberToMship_EndDate).Cast<DateTime>().FirstOrDefault()
                        join memtomship in eclipse.membertomships on report.member_Id equals memtomship.member_Id
                        into joinmemtomship from memtomship in joinmemtomship.DefaultIfEmpty()
                        join mshoption in eclipse.mshipoptions on memtomship.mshipOption_Id equals mshoption.mshipOption_Id
                        into joinmshipoption from mshoption in joinmshipoption.DefaultIfEmpty()
                        join membershiptypes in eclipse.mshiptypes on mshoption.mshipType_Id equals membershiptypes.mshipType_Id
                        into joinmembershipdifftypes from membershiptypes in joinmembershipdifftypes.DefaultIfEmpty()
                        join membershipstatustypes in eclipse.mshipstatustypes on memtomship.mshipStatusType_Id equals membershipstatustypes.mshipStatusType_Id
                        into joinmemberstatusdifftypes from membershipstatustypes in joinmemberstatusdifftypes.DefaultIfEmpty()                                
                        where (report.member_Gender.StartsWith(gender) || string.IsNullOrEmpty(gender))
                        && dob >= min && dob < max
                        && (strtdatees > strtdate && strtdatees < enddate)
                        select new
                        {
                            MemberID = report.member_Id,
                            Lastname = report.member_Lastname,
                            Firstname = report.member_Firstname,
                            Postcode = report.member_Postcode,
                            Reference = report.member_Reference,
                            CardNum = report.member_CardNum,
                            IsBiometric = report.member_IsBiometric,
                            DOB = report.member_Dob,
                            MShipType = membershiptypes.mshipType_Name,
                            StatusType = membershipstatustypes.mshipStatusType_Name,
                            EndDate = memtomship.memberToMship_EndDate
                        };
        bs2.DataSource = membersreports;
    return bs2;
 }

我正在以我在下面提到的形式访问上面的类...

  public void Getgroupcorporatemembers()
  {

        int startdays = 0;
        int enddays = 0;
        if (cbMeperiodType.Text == membershipexpiry.type1)
        {
            startdays = 0;
            enddays = 7;

        }

        if (cbMeperiodType.Text == membershipexpiry.type2)
        {
            startdays = 8;
            enddays = 14;

        }

        if (cbMeperiodType.Text == membershipexpiry.type3)
        {
            startdays = 15;
            enddays = 30;

        }
        if (cbMeperiodType.Text == membershipexpiry.type4)
        {
            startdays = 31;
            enddays = 90;            

        }

        DateTime today = DateTime.Now;
        DateTime strtdate = today.AddDays(startdays);
        DateTime enddate = today.AddDays(enddays);

        int agefrom = Convert.ToInt32(cbMeFrom.Text);
        int ageto = Convert.ToInt32(CbMeTo.Text);
        DateTime max = today.AddYears(-agefrom);
        DateTime min = today.AddYears(-ageto);
        string gender = "";
        gender = Classes.reportmembers.ConvertGender(cbMEGendertype.Text);

            dgvReportMembers.DataSource = objreports.getmebershipexpirymembers(gender, strtdate, enddate, max, min);// here i am accessing the method in class
            SetDgvheaders();


    }
    struct membershipexpiry
    {
        public const string type1 = "Next 7 Days";
        public const string type2 = "8 - 14 Days";
        public const string type3 = "15 - 30 Days";
        public const string type4 = "31 - 90 Days";        
    }

但我在这一行遇到错误...bs2.DataSource = membersreports;

   Error :Nullreference excpetion was unhandled 
          Object reference not set to an instance of an object.

【问题讨论】:

  • @Yochai - 但是函数的第一行会抛出异常。
  • @Yochai 不。查询中的某些内容为空。查询仅在分配给数据源时才被评估,因此该行发生空引用异常。
  • @Oded 我确定我在“bs2.DataSource = membersreports;”这一行得到了空引用异常
  • 你是在调试中编译吗?还是发布优化?
  • @Yochai 我已将此方法放入按钮单击事件中,当我选择“cbperiod”中的任何项目时,它会在此行出现错误 bs2.DataSource = membersreports;

标签: c# .net winforms linq linq-to-entities


【解决方案1】:

我同意 Yochai 的观点,最可能的问题是查询中的 let 语句。例如,如果有 null member_Dob,则 Cast 方法将抛出 NullReferenceException。

在枚举之前不会执行 Linq 查询。数据源分配语句将枚举查询,但它不会告诉您它在哪一行失败。尝试手动枚举查询,使用 try catch 块并在 catch 块中设置断点。这可能会帮助您找到导致问题的行。

        foreach (var memb in membersreports)
        {
            try
            {
                Console.WriteLine(memb.DOB);
            }
            catch (Exception ex)
            {
                //set a breakpoint here or in the try block
                Console.WriteLine(ex.Message);
            }
        }

【讨论】:

    【解决方案2】:

    这可能是查询,而不是我最初认为的 bs2 变量。

    字段(如 eclipse.mshipoption)不会引发异常。

    Take(1) 可能不会得到结果,然后当你尝试投射结果时它会失败。

    我会尝试看看这些返回什么:

    let dob = eclipse.members.Take(1)
                             .Select(x => report.member_Dob)
                             .Cast<DateTime>()
                             .FirstOrDefault()
    let strtdatees = eclipse.membertomships.Take(1)
                                           .Select(x => x.memberToMship_EndDate)
                                           .Cast<DateTime>()
                                           .FirstOrDefault()
    

    【讨论】:

    • member_dob 的数据类型是字符串,所以我无法将字符串与日期时间进行比较,因为我已经这样做了.... let dob= eclipse.members.Take(1).Select(x=>report. member_Dob).Cast().FirstOrDefault() 你能建议任何替代方案吗...
    • 真的想不出一个替代方法来阻止它和调试部分查询
    • 没有其他方法可以使用实体框架将字符串转换为日期时间,我已经尝试过这个 convert.ToDatetime() 但实体框架不支持这个......
    • 您不必走那么远。如果 Take(1) 没有返回任何东西,它将失败。只需检查 Take(1) 是否返回并反对。
    猜你喜欢
    • 2012-05-27
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2016-06-05
    • 1970-01-01
    • 2014-04-19
    • 2014-07-21
    相关资源
    最近更新 更多