错误!对象引用未设置对象的实例c#

时间:2013-12-18 23:50:24

标签: c# sql database object

需要你的帮助,我正在关注创建SQL数据库的在线教程

http://www.homeandlearn.co.uk/csharp/csharp_s12p9.html

我已经按照提供给点的代码,但我已经反对一个错误,我继续得到对象引用是C#中对象实例的集合

visual studio正在标记的代码是

cb.DataAdapter.Update(ds.Tables[0]);

我不知道,错误意味着什么,通过读取错误它与空引用有关。任何人都可以告诉我错误是什么以及如何解决它。

这是我的班级档案(http://pastebin.com/38zW6Zk7):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EmployeeDatabse
{
  class DatabaseConnection
  {
    private string sql_string;
    private string strCon;
    System.Data.SqlClient.SqlDataAdapter da_1;

    public string sql
    {
      set { sql_string = value; }
    }

    public string connection_string
    {
      set { strCon = value; }
    }

    public System.Data.DataSet GetConnection
    {
      get { return MyDataSet(); }
    }

    public void UpdateDatabase(System.Data.DataSet ds)
    {

      System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(da_1);
      cb.DataAdapter.Update(ds.Tables[0]);
    }

    private System.Data.DataSet MyDataSet()
    {
      System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strCon);
      con.Open();

      System.Data.SqlClient.SqlDataAdapter da_1 = new System.Data.SqlClient.SqlDataAdapter(sql_string, con);
      System.Data.DataSet dat_set = new System.Data.DataSet();
      da_1.Fill(dat_set, "Table_data_1");
      con.Close();

      return dat_set;

    }

  }

}

4 个答案:

答案 0 :(得分:1)

这是C#中的常见异常,当您在空引用上使用点运算符时会发生这种情况。对您而言,这意味着cbds在执行该行代码时的值为null

我查看了你简要发布的教程,但实际上无法提供帮助,因为它本身没有代码,我没有时间拼凑所有的片段并说“哦,你从来没有初始化ds“但是,如果你发布了更新版本的代码(需要更多上下文,我需要查看cb和ds的声明位置/你设置这些值的任何地方)我可以给你一个更具体的解决方案。

有几种解决方法;第一个是完全阻止空值,第二个是添加无效检查,以防止引发异常。我个人建议同时进行这两项检查。首先,通过app跟踪这些变量的值,并确保通向该行的所有代码路径都会导致它们被设置,其次,您应该将一些逻辑包含在if if (thisReference != null) { thisReference.DoSomething }形式的语句中

答案 1 :(得分:0)

检查数据集(ds)中是否有表。如果数据集没有任何表,则可能会出现该错误。

答案 2 :(得分:0)

NullReferenceException(您得到的)意味着您尝试使用null的引用类型执行某些操作。在你失败的代码行中,

cb.DataAdapter.Update(ds.Tables[0]);

其中任何一个都可能为null:

  • cb
  • DataAdapter属性(cb.DataAdapter
  • ds
  • ds.Tables[0](没有任何内容表明DataSet必须包含任何表。或者事件o包含表集合。不要问我怎么知道这个:D)。

如果没有看到背景(你如何使用你的班级),我们很难(不可能?)说出问题所在。

但是,可以轻松解决调试程序中的问题。只需在失败的行上设置一个断点,并在遇到断点时检查事物的值。

或者,您可以使用断言来表达您的期望。在抛出异常的位置之前注入这些语句将为您确定问题:

Debug.Assert( cb             != null , "cb is null" ) ;
Debug.Assert( cb.DataAdapter != null , "cb.DataAdapter is null" ) ;
Debug.Assert( ds             != null , "ds is null" ) ;
Debug.Assert( ds.Tables      !+ null , "ds.Tables is null" ) ;
Debug.Assert( ds.Tables.Count > 0    , "ds.Tables contains no tables" ) ;

答案 3 :(得分:0)

  

对象引用未设置为对象的实例

当您尝试调用实际为null的变量的方法时,通常会发生这种情况。在尝试调用某种方法之前,请务必检查null的变量。

请注意,您有一个永远不会初始化的名为da_1的字段。您的MyDataSet方法正在创建一个名为da_1的局部变量,而不是使用类变量。然后在UpdateDatabase上尝试创建一个未初始化的SqlCommandBuilder传递da_1。这可能是个问题。