【发布时间】:2018-06-23 02:56:08
【问题描述】:
点击表单按钮后数据集为NULL。
我想学习和理解 Visual Basic 2017。 在测试网络表单上,一些文本框填充有数据集 (DS) 项目(在页面加载期间)。 这很好用,没有问题。
表单上还有一个保存按钮,单击后必须用数据集项填充文本框。 但随后 dataaet 似乎为 NULL。 这怎么可能? 我希望有人能告诉我出了什么问题,我知道数据集在运行时会保持 dukkws。
点击保存按钮后出现此错误:======================================= === System.NullReferenceException:对象引用未设置为对象的实例。 在 S:\P2 S VS tests\NW DB 中的 NW_DB_update_test.NWtest.testDS()
更新测试\NW DB 更新测试\NWtest.aspx.vb:line 46
VB的源是====================================
选项显式打开 选项严格开启
导入 System.Data.SqlClient
公开课 NWtest 继承 System.Web.UI.Page
Public DA As SqlDataAdapter
Public DS As System.Data.DataSet
Public CB As SqlCommandBuilder
Public Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Call GETNWDS()
Call testDS()
End If
End Sub
Public Sub GETNWDS()
'' opencustumorDataAdapterdaaset DS
Dim connectionString = ConfigurationManager.ConnectionStrings("NW testConnectionString").ConnectionString
Dim queryString As String = "SELECT CustomerID, CompanyName, ContactName FROM Customers where CustomerID='ALFKI'"
Dim conn As New SqlConnection(connectionString)
DA = New SqlDataAdapter(queryString, conn)
DS = New System.Data.DataSet
DA.Fill(DS)
CustomerIDbox.Text = DS.Tables(0).Rows(0).Item("CustomerID").ToString
CompanyNamebox.Text = DS.Tables(0).Rows(0).Item("CompanyName").ToString
ContactNamebox.Text = DS.Tables(0).Rows(0).Item("ContactName").ToString
End Sub
Public Sub testDS()
Try
Dim v As String
v = "in DS= " + DS.Tables(0).Rows(0).Item("ContactName").ToString
Textbox.Text = v
'Error after clicking the save button:
' System.NullReferenceException
' Object reference Not set to an instance of an object.
' at NW_DB_update_test.NWtest.testDS() in S: \P2 S VS tests\NW DB update test\NW DB update test\NWtest.aspx.vb:line 46
Catch x As Exception
Textbox.Text = x.ToString
End Try
End Sub
结束类
================================================ ==========================================
【问题讨论】:
-
这是因为此时 DS 中没有任何数据。在 Web 上下文中,对服务器的每个请求(页面加载、按钮单击等)都会导致 C# 脚本的全新执行。变量的值不会在请求之间保持不变,您不能像使用桌面应用程序那样从中断的地方继续。在进一步深入之前,请阅读 ASP.NET 页面的页面生命周期(它甚至比其他 Web 技术更奇特)。 MS 有关于它的文章。
-
“在 Web 上下文中,对服务器的每个请求(页面加载、按钮单击等)都会导致 C# 脚本的全新执行。”这是否意味着在 C# 中 DS 会自动重新填充?这是 VB 里的娘炮吗?
-
VB/C# 没有区别。不,我的意思恰恰相反,它不会自动重新填充,这就是你的变量为空的原因。顺便说一句,回发时运行什么代码?据我所知,上述代码都不会在回发时运行(即单击您的按钮时),除非您已通过您的 aspx 代码将这些 Subs 之一绑定到按钮?您是否实际显示了发生错误的代码?你能告诉我们按钮吗?它绑定到什么事件处理程序?
-
问题解决了。感谢您对刷新 DS 的评论,我才知道为什么 DS 没有更新,原因是“If Not IsPostBack Then”这行写错了地方。这对我来说非常愚蠢,我不知道刷新。现在更新数据库工作正常。非常感谢您的努力和提示。