none
开发的PC上调试,安装,运行没有任何问题,但是发布安装到别的PC上后运行就会报System.NullReferenceExceptiony异常,要如何解决?

    问题

  •   开发的电脑上用的是Framework 4 ,安装的电脑上也装了framework 4 或者 4.5 ,工具VS2012。 每次用自带的发布工具发布后,同样的安装包。在有些PC上就可以正常运行,在有些PC上就会报System.NullReferenceExceptiony异常。

    报错信息如下:

    System.NullReferenceException: Object reference not set to an instance of an object.
       at DAL.PipeArea.getPipeArea()
       at BLL.PipeArea.getPipeArea()
       at PipeWater.PipeUserFrom.UserFrom_Load(Object sender, EventArgs e)
       at System.Windows.Forms.Form.OnLoad(EventArgs e)
       at System.Windows.Forms.Form.OnCreateControl()
       at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       at System.Windows.Forms.Control.CreateControl()
       at System.Windows.Forms.Control.WmShowWindow(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ContainerControl.WndProc(Message& m)
       at System.Windows.Forms.Form.WmShowWindow(Message& m)
       at System.Windows.Forms.Form.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    相关代码:

    //new一个新的from就执行以下代码。

     private void UserFrom_Load(object sender, EventArgs e)
            {
                this.dgvUser.AutoGenerateColumns = false;
                List<Model.PipeArea> listArea = new List<Model.PipeArea>();
            
            // 报错信息相关的执行代码 
               listArea = bllPa.getPipeArea();
             
               Model.PipeArea pa = new Model.PipeArea();
                pa.AreaName = "不限";
                pa.Id = 0;
                listArea.Insert(0, pa);
                areaCob.DataSource = listArea;
                areaCob.DisplayMember = "AreaName";
                areaCob.ValueMember = "Id"; 
    
    
    
            }


    //bllPa.getPipeArea();调用的是以下方法

     public List<Model.PipeArea> getPipeArea()
            {
                List<Model.PipeArea> paList = new List<Model.PipeArea>();
                                         
                DataTable dt =  SqlHelper.ExecuteDataTable("select * from pipeArea order by Id");
               if (dt.Rows.Count > 0)
               {
                  
                   foreach (DataRow dr in dt.Rows)
                   {
                       Model.PipeArea pa = new Model.PipeArea();
                       pa.Id = Convert.ToInt32(dr[0]);
                       pa.AreaName=dr[1].ToString();
                       paList.Add(pa);
                   }
    
    
               }
    
    
               return paList;
    
    
            }



    \\SqlHelper.ExecuteDataTable() 方法如下:

       
    public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
            {
               
                DataSet ds = new DataSet();
             
               using(SqlDataAdapter adapter = new SqlDataAdapter(sql, connstr)){
                
                   try
                   {
                       adapter.SelectCommand.Parameters.AddRange(parameters);
                   
                       adapter.Fill(ds);
                   }
                   catch (Exception e)
                   {
                       Console.WriteLine(e.Message);
                       return null;
                   }
               }
                return ds.Tables[0];
            }

    在客户PC上安装好程序后,触发相关的功能块就会出现该错误提示,询问是否继续 如果点击 继续,程序也能运行,但是相关的控件中,数据为null。

    由于是刚开始学习开发winform程序,所以对这个问题很茫然,望能得到解答,谢谢!!!


    • 已编辑 CaiGuangYu 2015年12月8日 3:11 补充
    2015年12月8日 3:06

答案

  • 您好,

    System.NullReferenceException异常表示,你使用了一个为空的对象,根据你的代码,唯一可能返回空值的是。

                   catch (Exception e) {
                      
    Console.WriteLine(e.Message);
                      
    return null;
                  
    }

    所以您需要记录下这个异常信息,比如保存到文件中,供出现异常后查看。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年12月10日 8:47

全部回复

  • 是否数据库链接的是你本地的链接,如果你用的localhost,请改为本机ip
    2015年12月8日 3:31
  • 是否数据库链接的是你本地的链接,如果你用的localhost,请改为本机ip

    检查过的!而且也能从数据库中取出数据,只是我绑定的ComBox 也就是areaCob.DataSource = listArea; 这段代码中的数据没有取出来,可是代码我检查过,没有任何问题啊!
    2015年12月8日 3:43
  • 应该是你线上数据和本地数据不一致。

    没对线上数据初始化什么的

    2015年12月8日 7:04
  • 应该是你线上数据和本地数据不一致。

    没对线上数据初始化什么的

    没看懂是什么意思。我在本地都不存数据的,所有数据都是直接读的数据库。
    2015年12月8日 7:10
  •   自己试出来了!但是还是不知道引起这个问题的原因到底是什么?这个问题让人郁闷的地方就是,发布后再有的电脑上运行没问题,在有的电脑上缺出现System.NullReferenceException异常。

       if (dt.Rows.Count > 0)
               {
                  
                   foreach (DataRow dr in dt.Rows)
                   {
                       Model.PipeArea pa = new Model.PipeArea();
                       pa.Id = Convert.ToInt32(dr[0]);
                       pa.AreaName=dr[1].ToString();
                       paList.Add(pa);
                   }
    
    只要把 上段代码中的if (dt.Rows.Count > 0) 改为if (dt.Rows.Count != 0)就可以了。


    2015年12月9日 1:16
  • 您好,

    System.NullReferenceException异常表示,你使用了一个为空的对象,根据你的代码,唯一可能返回空值的是。

                   catch (Exception e) {
                      
    Console.WriteLine(e.Message);
                      
    return null;
                  
    }

    所以您需要记录下这个异常信息,比如保存到文件中,供出现异常后查看。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年12月10日 8:47