InvalidCastException 异常时,引用为 NULL 的 DataColumn 的值

文章翻译 文章翻译
文章编号: 310371 - 查看本文应用于的产品
下面的 Microsoft.net 框架类库命名空间引用这篇文章:
  • System.Data
  • System.Data.SqlClient
展开全部 | 关闭全部

本文内容

症状

当您引用的类型化或非类型化是否为 NULL,一个 DataColumn 值时,您将会收到异常。

对于类型化 数据集,您将收到以下异常:
invalidcast.exe 中发生未处理的异常的类型 System.Data.StrongTypingException
其他信息: 无法获取值,因为它是 DBNULL。
对于非类型化 数据集,您将收到以下异常:
microsoft.visualbasic.dll 中发生未处理的异常的类型 System.InvalidCastException
其他信息: 从 DBNULL 键入字符串类型的广播是无效。

原因

原因 1

您在使用类型化的 数据集 时被引起异常的引用该列的值为 NULL 的时。

原因 2

您在使用一个非类型化的 数据集 时,列的值为 NULL,并为其分配该变量不支持 NULL。

解决方案

原因 1

您访问它的值之前测试 NULL 列。在一个非类型化 数据集,使用 $ DataRow.IsNull 方法。在类型化 数据集,使用 $ DataRow.IscolumnnameNull 属性。

原因 2

使用的适当数据类型,可以存储 NULL 的变量。

状态

此行为是设计使然。

更多信息

重现行为的步骤

  1. 启动 Microsoft Visual Studio.net。
  2. 在 Visual Basic.net 中创建新的 Windows 应用程序项目。默认情况下,Form1 将添加到项目。
  3. 请确保您的项目包含对 System.Data 命名空间的引用。
  4. 将放置在 Form1 上的一个 按钮 控件。
  5. btnUntypeUntype文本 属性更改按钮的 名称 属性。
  6. 使用 Imports 语句在 System 命名空间和 System.Data 命名空间中的,以使您无需限定在以后在代码中的这些命名空间中声明。下面的代码添加到 Form1 的"通用声明"节:
       Imports System
       Imports System.Data
       Imports System.Data.SqlClient
    					
  7. btnUntype 事件中添加以下代码:
            Dim str As String
            Dim ds As New DataSet()
            Dim r As DataRow
            Dim con As New SqlConnection("server=myserver;integrated security=sspi;database=northwind")
            Dim da As New SqlDataAdapter("select * from customers where customerid='ANTON'", con)
            da.Fill(ds, "customer")
            r = ds.Tables(0).Rows(0)
            'Uncomment to check for Null. 
            'If r.IsNull("fax") Then
            '   MessageBox.Show("Value is Null")
            'End If
            str = r("fax") 'Comment line to check for Null.
            MessageBox.Show(str) 'Comment line to check for Null.
            
    					
  8. 修改连接字符串 (myserver) 为您的环境的相应的服务器名称。
  9. 保存您的项目。在 调试 菜单上单击 $ 开始 以运行您的项目。
  10. 单击 Untype。请注意前面提到的非类型化 数据集 的异常。
  11. 取消注释 IF 语句,然后注释以下 IF 语句,以检查空值的行。
  12. 保存您的项目。在 调试 菜单上单击 开始,,然后再运行您的项目。请注意,消息框显示"值为 Null"。
  13. 将放置在 Form1 上的另一个 按钮 控件。
  14. btntype 并为 类型Text 属性更改按钮的 名称 属性。
  15. 通过使用罗斯文数据库中的客户表创建类型化的 数据集。重命名 sqldaSQLDataAdapter
  16. 将下面的代码添加到 btntype 事件:
            sqlda.Fill(DataSet11)
            Dim str As String
            Dim int As Integer
            Dim cust As DataSet1.CustomersRow
            cust = DataSet11.Customers.Rows(0)
            'Uncomment to catch null values.  
            'If cust.IsFaxNull Then
            '    MessageBox.Show("Value is Null")
            'End If
            str = cust.Fax() 
            MessageBox.Show(str)
            '    Comment line to check for Null.
    					
  17. 运行在的应用程序,然后单击 类型 按钮。请注意该异常。
  18. 取消注释 if...then 代码块中,然后注释代码的最后两行。
  19. 保存了的应用程序,然后运行该应用程序,并注意到该消息框。

参考

有关创建类型化数据集的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
315678如何创建、 通过使用 Visual Basic.net 中使用类型化数据集
有关 ADO.NET 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
313590ADO.NET 的指南

属性

文章编号: 310371 - 最后修改: 2007年2月27日 - 修订: 2.7
这篇文章中的信息适用于:
  • Microsoft ADO.NET 2.0
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Visual Basic 2005
  • Microsoft Visual .NET 2002 标准版
  • Microsoft Visual Basic .NET 2003 标准版
关键字:?
kbmt kbprb kbsystemdata KB310371 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 310371
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com