c#:未将对象引用设置到对象的实例--可能出现的问题总结

  例子1      public int RunProc(string procName, string set, string opt)
        {
            this.Open();//打开数据库连接
            procName = string.Format(procName, set, opt);
            OracleCommand cmd = new OracleCommand(procName, con1);//创建SqlCommand命令对象
            OracleTransaction myTransaction = null;
            cmd.ExecuteNonQuery();//执行SQL命令
            this.Open();
            myTransaction =con1.BeginTransaction();
            cmd.Transaction = myTransaction; 
            //cmd.Transaction.Commit(); 直接这么写会报“未将对象应用到实例。。。”
            myTransaction.Commit();
            this.Close();//关闭数据库连接
            return 1;//返回1,表示执行成功
        }

一、网络上的一般说法

1、ViewState 对象为Null。
2、DateSet 空。
3、sql语句或Datebase的原因导致DataReader空。
4、声明字符串变量时未赋空值就应用变量。
5、未用new初始化对象。
6、Session对象为空。
7、对控件赋文本值时,值不存在。
8、使用Request.QueryString()时,所获取的对象不存在,或在值为空时未赋初始值。
9、使用FindControl时,控件不存在却没有做预处理。
10、重复定义造成未将对象引用设置到对象的实例错误.

 

二、 (1)所设置的变量为空值或没有取到值,一般出现在传递参数的时候出现这个问题,也会在使用DataGrid或gridview或datalist等数据控件时出现.

  (2)控件名称与codebehind里面的没有对应

  (3)未用new初始化对象

  (4)在程序中所引用的控件不存在

  解决方法:

  (1)使用try..catch...finally捕捉错误,或直接用response.write()输出所取的变量值

  (2)查看代码中是否存在未初始化的变量

 

三、SqlConnection.Open   未将对象引用设置到对象的实例

在使用VS2003开发 ASP.NET程序时候 有时候操作 SqlConnection对象的Open()方法时候会出现

未将对象引用设置到对象的实例。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

源错误: 
。。。。

conn.Open();

......

跟踪调试也肯定可以确定 对conn进行new 操作 但是程序经常在这个地方报错,但是有时候重启服务器或者重启IIS有能正常使用了。 怎么调试也找不到问题  那么这个时候可能是 你本机上安装的.NET FRAMEEWORK 框架有问题,可能没有没有安装SP1.1补丁  
需要打NET FRAMEEWORK1.1 SP1的补丁,到微软官方网站下载安装后就好了。

 

四、一般出现NullReferenceException异常的我个人总结有以下情况:

1、对象所在的命名空间没有引用
2、对象没有实例化
3、出现异常,实例化失败对象为 null

 

 五、IIS 扛不住的时候,也会出现上面的错误。

当应用程序的用户访问量超过它能承受的范围之后,就会出错。
改善你的程序,使用缓存,尽量减少与数据库交互的次数。

 

六、我碰到的问题是,无意重置了DataSet引用,后出现这个问题,请大家好好查查自己的代码,是不是在其他地方重新引用了,在我的程序中DataSet被设置成全局对象。

 

七、当你发现所有的方法不行时,打上.netframework的补丁

 

八、我出现这个错误,仅仅因为网站里面DAL的dll文件失效,业务层实例化不了IDAL里面的对象 

但也浪费了一下午的时间在调代码上

 

九、为每个可疑的地方添加监视,起初以为是sql语句写错了,查了几遍,换用sql语句还是报同样的错误。根据google出来的结果,提到对象重定义会引起这样的结果。根据这一提示,替换掉页面级全局对象,总算搞定了。

       class DBOper{
            /*构造函数没有函数体
             *
             *c#写的 一系列对数据库操作方法
             *
             *
       }
       最初为了省事,尽量少声明对象,只在全局声明了一个private DBOper db=new DBOper(),在不同方法里面调用该对象的方法,以避免为其定义而造成内存浪费。后来代码重构,在编译的时候并未报错。但是当运行的时候,就出现” NullReferenceException: 未将对象引用设置到对象的实例“。结果就因它而搞了几个小时。后来根据google的结果,将不同方法中使用到的DBOper对象一一重定义为局部变量(一个方法里面只定义一个DBOper对象,多次调用其方法均正常),去掉全局的private变量。再运行的时候就正常了。
       至于为什么将自定义的对象提成为class为private在不同的方法里面使用后而出现这样的问题,现在还不是很清楚.........................

 

已标记关键词 清除标记
对象引用设置对象实例。 说明: 执行当前 Web 请求期间,出现经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 对象引用设置对象实例。 源错误: 行 20: string userName = StrHelper.ConvertSql(UserName.Text.ToString()); 行 21: string userPwd = StrHelper.EncryptPassword(PassWord.Text.ToString(), StrHelper.PasswordType.MD5); 行 22: if (bs.isLoginValidate(userName, userPwd)) 行 23: { 行 24: 源文件: d:\wgm\vs\text\web\Login.aspx.cs 行: 22 堆栈跟踪: [NullReferenceException: 对象引用设置对象实例。] Leyp.SQLServerDAL.UserDAL.isExistsUserName(String UserName) in C:\Users\yuqin\Desktop\Leyipai\SQLServerDAL\UserDAL.cs:181 Leyp.SQLServerDAL.UserDAL.isLoginValidate(String UserName, String PassWord) in C:\Users\yuqin\Desktop\Leyipai\SQLServerDAL\UserDAL.cs:207 Login.LoginButton_Click(Object sender, ImageClickEventArgs e) in d:\wgm\vs\text\web\Login.aspx.cs:22 System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) +115 System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +120 System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563 #**_在这里分享一下我这问题的原因:是因为我的数据库表不全。希望能帮到后来人。_**#
想达到的效果:主窗口上面是一个容器panel,里面有3个下拉框,左边是一个toolStrip菜单栏,剩余部分是一个panel1(用来显示五个子窗口),如第一个图;按完第一个按钮,在主窗口的panel1上显示第一个子窗口(Win1)的内容,效果如图二; 下面是主窗口用的部分程序 ``` Win1 w1; w1 = new Win1(); private void toolStripButton1_Click(object sender, EventArgs e) { this.panel1.Controls.Clear(); // 清空原有的控件 w1.TopLevel = false; // 非顶级窗口 w1.FormBorderStyle = FormBorderStyle.None; // 不显示标题栏 //w1.Dock = System.Windows.Forms.DockStyle.Fill; // 填充panel w1.WindowState = FormWindowState.Maximized; this.panel1.Controls.Add(w1); // 添加w1窗体 //w1.Show(this); w1.Show(); flag = true; } private void button1_Click(object sender, EventArgs e) { if (flag == true && flag1 == true && flag2 == true) { w1.Creatchart1(); } } ``` 下面是Win1的其中的一个chart的程序 ``` private void Creatchart1() { string a = ((Form1)this.Owner).comboBox1.Text; string b = ((Form1)this.Owner).comboBox2.Text; string c = ((Form1)this.Owner).comboBox3.Text; string wax = a + b + c; string dbPath = @"D:\历年高考分数.db"; string sq = @"Data Source=" + dbPath; m = new SQLiteConnection(sq); m.Open(); SQLiteDataAdapter mAdapter = new SQLiteDataAdapter("select " + wax + ",yxlc from 表2", m); DataSet ds = new DataSet(); mAdapter.Fill(ds); DataTable dt = ds.Tables[0]; Series Series1 = new Series(); chart1.DataSource = dt; Series1.IsValueShownAsLabel = false;//是否显示图例 chart1.Series.Add(Series1); chart1.Series["Series1"].ChartType = SeriesChartType.Spline;//形状 chart1.Series[0].XValueMember = "yxlc";//X轴数据成员列 chart1.Series[0].YValueMembers = wax; chart1.Series[0].IsValueShownAsLabel = true;//显示坐标 chart1.DataBind(); chart1.BringToFront(); m.Close(); } ``` 启动时在string a = ((Form1)this.Owner).comboBox1.Text;处显示其他信息: 对象引用设置对象实例。 若将去掉this.panel1.Controls.Add(w1),w1.TopLevel = true,启动时Win就出现在电脑下面的任务栏里了。 我想至始至终任务栏里就一个主窗口,应该怎么改 ![图片说明](https://img-ask.csdn.net/upload/201908/29/1567048963_136960.png)![图片说明](https://img-ask.csdn.net/upload/201908/29/1567048997_414116.png)
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页