Nullreferenceexception未处理(对象引用未设置为对象的实例)

时间:2011-09-15 18:21:43

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

我有一个有四个组合框的表格说cbmefrom(年龄)cbmeto(年龄)cbperiod(句号类型值谎言这个“未来7天”......)和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.

2 个答案:

答案 0 :(得分:0)

这可能是我最初认为的查询,而不是 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()

答案 1 :(得分:0)

我同意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);
            }
        }