【问题标题】:Error! Object Reference not set of an instance of an object c#错误!对象引用未设置对象c#的实例
【发布时间】:2013-12-19 09:21:34
【问题描述】:

需要你的帮助,我正在关注创建 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;

    }

  }

}

【问题讨论】:

  • 您是在代码中的任何位置启动cbds 吗?请发布更多代码,以便我们为您提供帮助
  • 欢迎来到 Stack Overflow!几乎所有 NullReferenceException 的情况都是相同的。请参阅"What is a NullReferenceException in .NET?" 获取一些提示。
  • 我刚刚阅读了教程,并没有看到他们正在“更新”cb
  • 请提供您所写的全部代码。
  • 根据教程,顺便说一句,我认为这很垃圾,你应该有 System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder( da_1 );一些在范围内

标签: c# sql database object


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复,我已经上传了我的类文件的代码,这就是问题所在。如果您需要表单代码,请告诉我
  • @user3117267 所以如果我理解正确的话,在你的班级中,UpdateDatabase 会抛出异常。 cb 绝对不为空(您在使用它之前分配了行)。另一方面,ds 被传递到该方法中,它可以是任何值。检查以确保您传递的DataSet 不为空。如果是,您应该使用GetConnection 获取非空DataSet 并将其传递给UpdateDataBase
  • @user3117267 另外值得注意的是,MyDataSet() 不使用using 语句或在实现IDisoposable 的对象上显式调用Dispose。在任何使用实现 IDisposable 的类的地方,您都应该在 using (SqlConnection con = new SqlConnection(strCon)) { //code that uses con } 之类的 using 语句中声明该实例。
  • 我已经完成了它,但我一直在关注一个教程,所以我不知道我真正在寻找什么。我只知道它与:cb.DataAdapter.Update(ds.Tables[0]);但我不确定。对这一切还是很陌生
  • @user3117267 我刚刚告诉过你,ds 为空。检查UpdateDatabase 的调用站点,您传递了该方法ds,并且一个或多个调用站点正在传递一个空引用。如果您在编辑器中的某处右键单击该方法,您可以选择“查找所有引用”,它将为您提供调用该方法的所有位置的列表。从那里您可以在所有断点之前设置断点,运行代码,在每个断点确认您传递的参数是否为空。在某些地方,它是做必要的纠正。
【解决方案2】:

检查您的数据集(ds)中是否有表格。如果数据集没有任何表,您可能会收到该错误。

【讨论】:

    【解决方案3】:

    NullReferenceException(您得到的)表示您尝试使用 null 的引用类型做某事。在您失败的代码行中,

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

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

    • 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" ) ;
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 我已经完成了它,但我一直在关注一个教程,所以我不知道我真正在寻找什么。我只知道它与:cb.DataAdapter.Update(ds.Tables[0]);但我不确定。对此还是很陌生
      猜你喜欢
      • 2011-06-21
      • 2011-07-09
      • 2012-08-31
      • 2011-11-21
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多