【问题标题】:VB.Net initializing datasetsVB.Net 初始化数据集
【发布时间】:2013-08-26 17:57:01
【问题描述】:

Microsoft 何时开始强制使用“New”语句初始化数据集?我的公司有一个多年前启动的网站,其中很多数据集都是用类似

的语句声明的
Dim someDataset as Dataset = Nothing

此代码已经运行了很长时间,但我们最近开始收到错误消息,指出值不能为空。参数名称:数据集。

我已尽力更新此旧代码,但我不知道我们正在使用的库有任何更新,我正在尝试确定是什么触发了此错误。谢谢

我想强调的是,在错误开始发生之前没有对代码进行任何更改,这听起来不太可能。这是一个大型应用程序,数据集以多种方式在其中使用。在最近开始出现此错误之前,它已投入生产多年并按预期工作。

【问题讨论】:

  • 这样的改变听起来不太可能。它完全取决于您对数据集所做的工作。
  • VB 从 VB.Net 开始就需要实例。在 VB6 中有一些案例,在 VB.Net 中有少量案例,其中语言提供了默认实例。这通常与 UI 相关,但我不知道 DataSet 会发生这种情况
  • FWIW,Dim someDataset as Dataset = Nothing 是多余的。您可以离开 `=Nothing` 部分,结果是完全相同的 IL。
  • 但是该代码不是引发错误的地方,是吗?在您上面引用的声明和引发错误的点之间的某个地方,有另一段代码直接实例化数据集,或者通过将 someDataset 设置为返回数据集的函数的返回值,例如作为 DAL 中的 tableadapter 或类似的。这就是改变的地方;数据集不再被实例化。
  • DAL 是通常发生错误的地方。传回 UI 的数据集在加载和返回之前没有被初始化。根据函数,数据集是显式构建的,或者是从 DatabaseFactory 调用或 sqlAdapters 加载的。不是最初的开发者,我不确定他们为什么没有被初始化。但我不明白为什么这段代码已经工作了这么多年,只是在没有发布任何更改的情况下突然开始发送错误消息。我希望有人可能遇到过类似的问题并能告诉我原因。

标签: vb.net dataset


【解决方案1】:

自 .NET 的第一天起,这一点就没有改变。所有引用类型都必须在某处使用 New 语句创建,否则它们将保持为空引用 (Nothing)。

听起来应用程序中用于创建数据集的其他部分已被删除或更改,因此有时会返回 Nothing

【讨论】:

  • 我知道听起来是这样,但这需要在应用程序使用数据集的数百个地方进行更改
  • 会吗?或者这几百个也可以参考一些常见的地方?
  • 我试图找到与填充返回错误的数据集的函数的共同点。我曾希望可能有一个特定的数据库或连接被用来填充可能导致问题的数据,或者他们都引用的服务。在研究了几天之后,除了数据集在填充之前没有用“新”语句初始化之外,我找不到他们有任何共同点。添加该语句已经解决了问题,但它并没有解释为什么代码已经运行了几年而没有错误。
【解决方案2】:

声明和实例化是有区别的。

这一行声明了一个DataSet

Dim myDataSet As DataSet

注意:由于您只声明了一个DataSet 对象,因此它没有设置为实例,因此它是Nothing

这行实例化了一个DataSet:

myDataSet = New DataSet()

通常你会看到这些行放在一起,像这样:

Dim myDataSet = New DataSet()

如果你只声明了一个DataSet,那么你在使用之前一定要检查一下是不是Nothing,像这样:

If myDataSet Is Not Nothing Then
    ' Use myDataSet because there is an instance of it
End If

注意:您应该始终检查Function 的返回类型是否为Nothing

【讨论】:

  • 这正是我们为纠正问题所做的。我们检查并找到了没有使用新语句初始化的数据集的每个实例。我不明白为什么它以前没有这样做。
  • @user2718511 - 不幸的是,我相信我们无法回答。 :-(
  • @user2718511 - 您可能想要调查Null Object 模式。
  • 什么是空对象模式?
  • @user2718511 - 阅读Null Object Pattern In C#,我知道您使用的是VB.NET,但这将提供如何使用此模式的想法。
猜你喜欢
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2021-09-22
  • 2018-01-12
相关资源
最近更新 更多