【问题标题】:Object reference not set to an instance of an object error with vb, not always but often对象引用未设置为使用 vb 的对象错误的实例,并非总是如此,但经常如此
【发布时间】:2014-05-27 19:37:10
【问题描述】:

这是我在 stackoverflow 中的第一个问题,我是 .NET 的新手,如果是这样,请原谅我的愚蠢问题! 当我在本地测试它时没有问题。在服务器上,它开始工作良好,但一段时间后(更可能是在一些访问者访问该站点之后)它停止工作并出现此错误,大约 30 分钟后它开始工作。 这是我的代码: 后面的代码:

    Dim baglanti As String = "Data Source=xxx.xxx.xxx;Initial Catalog=xxVT;Persist Security Info=True;User ID=xxx;Password=xxx"
    Public mRs As SqlDataReader
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim Conn As SqlConnection
    Conn = New SqlConnection(baglanti)
        Conn.Open()
    Dim lcSQLCommand1 As New SqlCommand("Select * from Fiyatlar", Conn)
        mRs = lcSQLCommand1.ExecuteReader()
    End Sub

aspx 页面:

    <% If Not IsNothing(mRs) Then   'I also tried with IsDBNull here, but same result.
    Do While mRs.Read  %>      

   <!--do some job with mRs-->
   <%Loop  
   mRs.close()
   end if  %>

这是错误信息: 对象引用未设置为对象的实例。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

来源错误:

第 22 行: 第 23 行:

第 24 行:Do While mRs.Read%>
第 25 行:
第 26 行:

【问题讨论】:

  • 我已经读过那个了。首先我确切知道原因,数据读取器将空值变为空值。但问题是:为什么它有时会变成空值,但并非总是如此?第二个问题是,即使我放了 IsNothing(IsDBNull) 控件,它仍然返回相同的错误..
  • 您最好使用数据绑定控件而不是“手动”通过 SqlDataReader 运行
  • 可能你是对的约翰,但由于我的数据很少,我选择了数据阅读器,这对我来说更容易。如果我找不到这个问题的解决方案,我会改变我的编码。
  • IsDBNull 没有进行空检查。它正在对您的 SqlDataReader 对 DBNull.Value 进行评估。你的空检查应该是If not mRs Is Nothing Then ref:msdn.microsoft.com/en-us/library/tckcces5(v=vs.90).aspx

标签: asp.net vb.net


【解决方案1】:

我看到你的代码的方式,你可能会填满你的 SQL 连接,因为你没有关闭你的连接。 +1 @约翰桑德斯。您最好将数据绑定到控件。这就是拥有它们的全部意义所在。我将这个工作示例(修改了连接字符串/查询)刷新了 100 倍以上,没有任何问题。

Dim baglanti As String = "Data Source=xxx.xxx.xxx;Initial Catalog=xxVT;Persist Security Info=True;User ID=xxx;Password=xxx"
Public mRs As SqlDataReader
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim Conn As SqlConnection
    Conn = New SqlConnection(baglanti)
    Try
        Conn.Open()
        Using lcSQLCommand1 As New SqlCommand("Select * from Fiyatlar", Conn)
            repeater.DataSource = lcSQLCommand1.ExecuteReader()
            repeater.DataBind()
        End Using
    Catch ex as Exception
        ' handle your exception
    Finally
        Conn.Close()
        Conn.Dispose()
    End Try
End Sub

ASPX

    <asp:Repeater ID="repeater" runat="server" EnableViewState="false">
        <ItemTemplate>
            <%# Container.DataItem(0)%>...<%# Container.DataItem(1)%><br />
        </ItemTemplate> 
    </asp:Repeater>    

【讨论】:

  • 我编辑了我的问题,我正在关闭我的数据阅读器但没有关闭连接,所以它是通过连接创建的(有这样的词吗?)。无论如何,我决定按照你和约翰的建议改变我的编码方式。我使用中继器,到目前为止没有问题。谢谢你的详细回答。
猜你喜欢
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2022-06-16
  • 2013-05-03
  • 2011-07-09
  • 2012-08-31
相关资源
最近更新 更多