C# 错误!对象引用不是对象c实例的集合#

C# 错误!对象引用不是对象c实例的集合#,c#,sql,database,object,C#,Sql,Database,Object,需要您的帮助,我正在学习创建SQL数据库的在线教程 我遵循了提供给dot的代码,但我一直在纠正一个错误,在这里我得到的对象引用是C#中一个对象实例的集合 visual studio正在标记的代码是 cb.DataAdapter.Update(ds.Tables[0]); 我不知道错误是什么意思,读取错误与空引用有关。谁能告诉我错误是什么以及如何修复它 这是我的类文件(): 这是C#中的一个常见异常,在空引用上使用点运算符时会发生这种情况。这对您意味着当执行该行代码时,cb或ds的值为null

需要您的帮助,我正在学习创建SQL数据库的在线教程

我遵循了提供给dot的代码,但我一直在纠正一个错误,在这里我得到的对象引用是C#中一个对象实例的集合

visual studio正在标记的代码是

cb.DataAdapter.Update(ds.Tables[0]);
我不知道错误是什么意思,读取错误与空引用有关。谁能告诉我错误是什么以及如何修复它

这是我的类文件():


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

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


有两种方法可以解决这个问题:第一种是完全防止空值,第二种是添加空值检查,以防止引发异常。我个人建议将这两种检查都设置到位。首先,通过应用程序跟踪这些变量的值,并确保所有导致在设置它们的第行结果中,第二,您可能应该在if语句中包含一些逻辑,形式为
if(thisReference!=null){thisReference.DoSomething}
检查数据集中是否有表(ds)。如果数据集没有任何表,则可能会出现该错误。

一个
NullReferenceException
(您得到的)表示您试图使用一个
null
的引用类型执行某些操作。在失败的代码行中

cb.DataAdapter.Update(ds.Tables[0]);
其中任何一项都可能为空:

  • cb
  • 它的
    DataAdapter
    属性(
    cb.DataAdapter
  • ds
  • ds.Tables[0]
    (没有任何规定说
    数据集必须包含任何表。或者事件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" ) ;
对象引用未设置为对象的实例

这通常发生在您尝试调用实际为
null
的变量的方法时。在尝试调用某个方法之前,请始终检查您的变量是否为
null


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

您是否在代码中的任何地方启动了
cb
ds
?请发布更多代码,这样我们可以帮助您欢迎堆栈溢出!几乎所有NullReferenceException的情况都是一样的。请查看一些提示。我刚刚阅读了教程,没有看到它们“更新”的任何地方
cb
。如果你能提供你所写的全部代码,请提供。根据我认为是垃圾的教程,你应该有System.Data.SqlClient.SqlCommandBuilder cb=new System.Data.SqlClient.SqlCommandBuilder(da_1);一些在范围内的地方谢谢你的回复,我已经上传了我的类文件的代码,这就是问题所在。如果你需要表单代码,请告诉我know@user3117267因此,如果我理解正确,在您的类中,
UpdateDatabase
会抛出异常。
cb
绝对不是空的(您在使用它之前分配行)另一方面,
ds
被传递到该方法中,它可以是任何值。检查以确保传递的
DataSet
不为null。如果为null,则应使用
GetConnection
获取非null的
DataSet
并将其传递到
UpdateDataBase
@user3117267,也值得注意,
MyDataSet()
不使用
using
语句,也不显式调用
Dispose
对实现
IDisoposable
的对象进行处理。在任何使用实现
IDisposable
的类的地方,都应该在using语句中声明实例,如
using(SqlConnection con=new SqlConnection(strCon)){//code使用con}
。我已经看过了,但我一直在遵循一个教程,所以我不知道我真正想要的是什么。我所知道的是:cb.DataAdapter.Update(ds.Tables[0]);但我不确定。对这件事还是很陌生的all@user3117267我刚才告诉过你,
ds
是空的。检查调用站点的
UpdateDatabase
你传递了该方法
ds
,一个或多个调用站点传递了一个空引用。如果你右击编辑器中某个地方的方法,你可以选择“查找所有引用”它将为您提供一个调用该方法的所有位置的列表。从那里,您可以在所有断点之前设置断点,运行代码,在每个断点处确认您传递的参数是否为null
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" ) ;