Asp.net &引用;当不存在数据时读取的尝试无效”;
ASP.NET不存在数据时读取的尝试无效 第46行出现错误:Asp.net &引用;当不存在数据时读取的尝试无效”;,asp.net,sql-server,vb.net,visual-studio,Asp.net,Sql Server,Vb.net,Visual Studio,ASP.NET不存在数据时读取的尝试无效 第46行出现错误:Dim requestid=dbreader.GetInt32(1) 我的数据库中的那个列有数据,所以我被卡住了 如果需要,可以发布更多代码 Imports System.Data.SqlClient Public Class WebForm1 Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.E
Dim requestid=dbreader.GetInt32(1)
我的数据库中的那个列有数据,所以我被卡住了
如果需要,可以发布更多代码
Imports System.Data.SqlClient
Public Class WebForm1
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
writemystuff()
End Sub
Dim conn As New SqlConnection
Sub CloseDatabase()
conn.Close()
End Sub
Sub ConnectToDatabase()
conn.ConnectionString = ConfigurationManager.ConnectionStrings("dbSQL").ConnectionString
conn.Open()
End Sub
Sub writemystuff()
'Response.Write(SQL1)
Dim XMLOutput = "<?xml version=""1.0"" encoding=""utf-8"" ?>"
'XMLOutput = XMLOutput + "<?xml-stylesheet type=""text/xsl"" href=""XMLSchema1.xslt""?>"
XMLOutput = XMLOutput + "<requests "
XMLOutput = XMLOutput + " xmlns = ""http://www.w3schools.com"""
XMLOutput = XMLOutput + " xmlns:xsi = ""http://www.w3.org/2001/XMLSchema-instance"""
XMLOutput = XMLOutput + " xsi:schemaLocation=""http://www.w3schools.com XMLSchema1.xsd"">"
ConnectToDatabase()
Dim choice = Request("requestchoice")
Dim SQL1 = "select * from request where r_id = 314"
If choice = "Request 112" Then
SQL1 = "select * from request where r_id = 112"
End If
Dim cmd = New SqlCommand(SQL1, conn)
Dim dbreader = cmd.ExecuteReader()
For Each record In dbreader
Next
Dim requestid = dbreader.GetInt32(1)
XMLOutput = XMLOutput + "<vendor"
XMLOutput = XMLOutput + " v_name=""" & dbreader.GetString(2) & """"
XMLOutput = XMLOutput + " v_id=""" & dbreader.GetInt32(0) & """"
XMLOutput = XMLOutput + " r_id=""" & dbreader.GetInt32(1) & """"
XMLOutput = XMLOutput + " >"
Dim SQL2 = "select * from product where r_id = " & requestid
Dim cmd2 = New SqlCommand(SQL2, conn)
Dim dbreader2 = cmd2.ExecuteReader()
For Each record2 In dbreader2
XMLOutput = XMLOutput + "<product"
XMLOutput = XMLOutput + " p_name=""" & dbreader2.GetString(3) & """"
XMLOutput = XMLOutput + " p_id=""" & dbreader2.GetInt32(0) & """"
XMLOutput = XMLOutput + " cost=""" & dbreader2.GetDecimal(2) & """"
XMLOutput = XMLOutput + " >"
Next
dbreader2.Close()
XMLOutput = XMLOutput + "</request>"
CloseDatabase()
XMLOutput = XMLOutput + "</requests>"
Response.Write(XMLOutput)
End Sub
End Class
导入System.Data.SqlClient
公共类WebForm1
继承System.Web.UI.Page
受保护的子页加载(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Load
writemystuff()
端接头
Dim conn作为新的SqlConnection
子数据库()
康涅狄格州关闭
端接头
子连接数据库()
conn.ConnectionString=ConfigurationManager.ConnectionString(“dbSQL”).ConnectionString
康涅狄格州公开赛
端接头
子写入系统uff()
'Response.Write(SQL1)
Dim XMLOutput=“”
'XMLOutput=XMLOutput+“”
XMLOutput=XMLOutput+“”
ConnectToDatabase()
Dim choice=请求(“请求选择”)
Dim SQL1=“从请求中选择*,其中r\u id=314”
如果选择=“请求112”,则
SQL1=“从请求中选择*,其中r\u id=112”
如果结束
Dim cmd=新的SqlCommand(SQL1,conn)
Dim dbreader=cmd.ExecuteReader()
对于dbreader中的每条记录
下一个
Dim requestid=dbreader.GetInt32(1)
XMLOutput=XMLOutput+“”
Dim SQL2=“从产品中选择*,其中r\u id=“&requestid
Dim cmd2=新的SqlCommand(SQL2,conn)
Dim dbreader2=cmd2.ExecuteReader()
对于dbreader2中的每个记录2
XMLOutput=XMLOutput+“”
下一个
dbreader2.Close()
XMLOutput=XMLOutput+“”
CloseDatabase()
XMLOutput=XMLOutput+“”
Response.Write(XMLOutput)
端接头
末级
更新了仍有问题的代码:
Imports System.Data.SqlClient
Public Class WebForm1
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
writemystuff()
End Sub
Dim conn As New SqlConnection
Sub CloseDatabase()
conn.Close()
End Sub
Sub ConnectToDatabase()
conn.ConnectionString = ConfigurationManager.ConnectionStrings("dbSQL").ConnectionString
conn.Open()
End Sub
Sub writemystuff()
'Response.Write(SQL1)
Dim XMLOutput = "<?xml version=""1.0"" encoding=""utf-8"" ?>"
'XMLOutput = XMLOutput + "<?xml-stylesheet type=""text/xsl"" href=""XMLSchema1.xslt""?>"
XMLOutput = XMLOutput + "<requests "
XMLOutput = XMLOutput + " xmlns = ""http://www.w3schools.com"""
XMLOutput = XMLOutput + " xmlns:xsi = ""http://www.w3.org/2001/XMLSchema-instance"""
XMLOutput = XMLOutput + " xsi:schemaLocation=""http://www.w3schools.com XMLSchema1.xsd"">"
ConnectToDatabase()
Dim choice = Request("requestchoice")
Dim SQL1 = "select * from request where r_id = 314"
If choice = "Request 112" Then
SQL1 = "select * from request where r_id = 112"
End If
Dim cmd = New SqlCommand(SQL1, conn)
Dim dbreader = cmd.ExecuteReader()
For Each record In dbreader
While dbreader.Read()
Dim requestid = dbreader.GetInt32(1)
XMLOutput = XMLOutput + "<vendor"
XMLOutput = XMLOutput + " v_name=""" & dbreader.GetString(2) & """"
XMLOutput = XMLOutput + " v_id=""" & dbreader.GetInt32(0) & """"
XMLOutput = XMLOutput + " r_id=""" & dbreader.GetInt32(1) & """"
XMLOutput = XMLOutput + " >"
Dim SQL2 = "select * from product where r_id = " & requestid
End While
Dim cmd2 = New SqlCommand(SQL2, conn)
Dim dbreader2 = cmd2.ExecuteReader()
While dbreader2.Read()
XMLOutput = XMLOutput + "<product"
XMLOutput = XMLOutput + " p_name=""" & dbreader2.GetString(3) & """"
XMLOutput = XMLOutput + " p_id=""" & dbreader2.GetInt32(0) & """"
XMLOutput = XMLOutput + " cost=""" & dbreader2.GetDecimal(2) & """"
XMLOutput = XMLOutput + " >"
End While
Next
XMLOutput = XMLOutput + "</request>"
CloseDatabase()
XMLOutput = XMLOutput + "</requests>"
Response.Write(XMLOutput)
End Sub
End Class
导入System.Data.SqlClient
公共类WebForm1
继承System.Web.UI.Page
受保护的子页加载(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Load
writemystuff()
端接头
Dim conn作为新的SqlConnection
子数据库()
康涅狄格州关闭
端接头
子连接数据库()
conn.ConnectionString=ConfigurationManager.ConnectionString(“dbSQL”).ConnectionString
康涅狄格州公开赛
端接头
子写入系统uff()
'Response.Write(SQL1)
Dim XMLOutput=“”
'XMLOutput=XMLOutput+“”
XMLOutput=XMLOutput+“”
ConnectToDatabase()
Dim choice=请求(“请求选择”)
Dim SQL1=“从请求中选择*,其中r\u id=314”
如果选择=“请求112”,则
SQL1=“从请求中选择*,其中r\u id=112”
如果结束
Dim cmd=新的SqlCommand(SQL1,conn)
Dim dbreader=cmd.ExecuteReader()
对于dbreader中的每条记录
而dbreader.Read()
Dim requestid=dbreader.GetInt32(1)
XMLOutput=XMLOutput+“”
Dim SQL2=“从产品中选择*,其中r\u id=“&requestid
结束时
Dim cmd2=新的SqlCommand(SQL2,conn)
Dim dbreader2=cmd2.ExecuteReader()
而dbreader2.Read()
XMLOutput=XMLOutput+“”
结束时
下一个
XMLOutput=XMLOutput+“”
CloseDatabase()
XMLOutput=XMLOutput+“”
Response.Write(XMLOutput)
端接头
末级
您需要在SqlDataReader
对象上调用.Read()
,以获取行的数据,如下所示:
While dbreader2.Read()
' Do logic here to get individual values from each row
End While
更新:
与此相反:
Dim dbreader2 = cmd2.ExecuteReader()
For Each record2 In dbreader2
XMLOutput = XMLOutput + "<product"
XMLOutput = XMLOutput + " p_name=""" & dbreader2.GetString(3) & """"
XMLOutput = XMLOutput + " p_id=""" & dbreader2.GetInt32(0) & """"
XMLOutput = XMLOutput + " cost=""" & dbreader2.GetDecimal(2) & """"
XMLOutput = XMLOutput + " >"
Next
更新2: 好的,下面是完整的方法代码:
Sub writemystuff()
'Response.Write(SQL1)
Dim XMLOutput = "<?xml version=""1.0"" encoding=""utf-8"" ?>"
'XMLOutput = XMLOutput + "<?xml-stylesheet type=""text/xsl"" href=""XMLSchema1.xslt""?>"
XMLOutput = XMLOutput + "<requests "
XMLOutput = XMLOutput + " xmlns = ""http://www.w3schools.com"""
XMLOutput = XMLOutput + " xmlns:xsi = ""http://www.w3.org/2001/XMLSchema-instance"""
XMLOutput = XMLOutput + " xsi:schemaLocation=""http://www.w3schools.com XMLSchema1.xsd"">"
ConnectToDatabase()
Dim choice = Request("requestchoice")
Dim SQL1 = "select * from request where r_id = 314"
If choice = "Request 112" Then
SQL1 = "select * from request where r_id = 112"
End If
Dim cmd = New SqlCommand(SQL1, conn)
Dim dbreader = cmd.ExecuteReader()
Dim requestid As Integer
While dbreader.Read()
requestid = dbreader.GetInt32(1)
XMLOutput = XMLOutput + "<vendor"
XMLOutput = XMLOutput + " v_name=""" & dbreader.GetString(2) & """"
XMLOutput = XMLOutput + " v_id=""" & dbreader.GetInt32(0) & """"
XMLOutput = XMLOutput + " r_id=""" & dbreader.GetInt32(1) & """"
XMLOutput = XMLOutput + " >"
End While
Dim SQL2 = "select * from product where r_id = " & requestid
Dim cmd2 = New SqlCommand(SQL2, conn)
Dim dbreader2 = cmd2.ExecuteReader()
While dbreader2.Read()
XMLOutput = XMLOutput + "<product"
XMLOutput = XMLOutput + " p_name=""" & dbreader2.GetString(3) & """"
XMLOutput = XMLOutput + " p_id=""" & dbreader2.GetInt32(0) & """"
XMLOutput = XMLOutput + " cost=""" & dbreader2.GetDecimal(2) & """"
XMLOutput = XMLOutput + " >"
End While
dbreader2.Close()
XMLOutput = XMLOutput + "</request>"
CloseDatabase()
XMLOutput = XMLOutput + "</requests>"
Response.Write(XMLOutput)
End Sub
Sub-writemystuff()
'Response.Write(SQL1)
Dim XMLOutput=“”
'XMLOutput=XMLOutput+“”
XMLOutput=XMLOutput+“”
ConnectToDatabase()
Dim choice=请求(“请求选择”)
Dim SQL1=“从请求中选择*,其中r\u id=314”
如果选择=“请求112”,则
SQL1=“从请求中选择*,其中r\u id=112”
如果结束
Dim cmd=新的SqlCommand(SQL1,conn)
Dim dbreader=cmd.ExecuteReader()
将请求ID设置为整数
而dbreader.Read()
requestid=dbreader.GetInt32(1)
XMLOutput=XMLOutput+“”
结束时
Dim SQL2=“从产品中选择*,其中r\u id=“&requestid
Dim cmd2=新的SqlCommand(SQL2,conn)
Dim dbreader2=cmd2.ExecuteReader()
而dbreader2.Read()
XMLOutput=XMLOutput+“”
结束时
dbreader2.Close()
XMLOutput=XMLOutput+“”
CloseDatabase()
XMLOutput=XMLOutput+“”
Response.Write(XMLOutput)
端接头
您正在调用第一个数据读取器的下一个
:
For Each record In dbreader
' Do Nothing
Next
' Reader is now at the end - can't read any more!
Dim requestid = dbreader.GetInt32(1)
但实际上,您应该在dbReader.Read()时使用Do:
Do While dbReader.Read()
Dim requestid=dbreader.GetInt32(1)
XMLOutput=XMLOutput+“”
Dim SQL2=“从产品中选择*,其中r\u id=“&requestid
Dim cmd2=新的SqlCommand(SQL2,conn)
Dim dbreader2=cmd2.ExecuteReader()
在dbReader2.Read()时执行此操作
XMLOutput=XMLOutput+“”
环
环
DataReader用于从SQL Server数据库中读取仅向前的行流。您需要调用读取下一条记录
在您的代码上,您需要更改此项(例如,您需要更改它,因为它应该工作,请不要复制粘贴)
Dim dbreader2=cmd2.ExecuteReader()
对于dbreader2中的每个记录2
XMLOutput=XMLOutput+“”
下一个
比如
Dim dbreader2 = cmd2.ExecuteReader()
While dbreader2.Read()
XMLOutput = XMLOutput + "<product"
XMLOutput = XMLOutput + " p_name=""" & dbreader2.GetString(3) & """"
XMLOutput = XMLOutput + " p_id=""" & dbreader2.GetInt32(0) & """"
XMLOutput = XMLOutput + " cost=""" & dbreader2.GetDecimal(2) & """"
XMLOutput = XMLOutput + " >"
End While
Dim dbreader2=cmd2.ExecuteReader()
而dbreader2.Read()
XMLOutput=XMLOutput+“”
结束时
正如您可能想象的那样,只要您使用数据读取器,您的连接将仍然繁忙。您应该始终确保可以关闭数据读取器以关闭连接并再次将其发送到池。这是.NET中连接泄漏的主要原因之一
您可以使用语句“using”来执行try{}finally{}块(这是相同的事情)。我已经编辑了您的标题。请参见“”,其中的共识是“不,他们不应该”。我应该将Dim SQL2放在哪里?@user2860150-同一个位置,不要更改检索数据的方式,只需使用For Each record In dbreader
' Do Nothing
Next
' Reader is now at the end - can't read any more!
Dim requestid = dbreader.GetInt32(1)
Do While dbReader.Read()
Dim requestid = dbreader.GetInt32(1)
XMLOutput = XMLOutput + "<vendor"
XMLOutput = XMLOutput + " v_name=""" & dbreader.GetString(2) & """"
XMLOutput = XMLOutput + " v_id=""" & dbreader.GetInt32(0) & """"
XMLOutput = XMLOutput + " r_id=""" & dbreader.GetInt32(1) & """"
XMLOutput = XMLOutput + " >"
Dim SQL2 = "select * from product where r_id = " & requestid
Dim cmd2 = New SqlCommand(SQL2, conn)
Dim dbreader2 = cmd2.ExecuteReader()
Do While dbReader2.Read()
XMLOutput = XMLOutput + "<product"
XMLOutput = XMLOutput + " p_name=""" & dbreader2.GetString(3) & """"
XMLOutput = XMLOutput + " p_id=""" & dbreader2.GetInt32(0) & """"
XMLOutput = XMLOutput + " cost=""" & dbreader2.GetDecimal(2) & """"
XMLOutput = XMLOutput + " >"
Loop
Loop
Dim dbreader2 = cmd2.ExecuteReader()
For Each record2 In dbreader2
XMLOutput = XMLOutput + "<product"
XMLOutput = XMLOutput + " p_name=""" & dbreader2.GetString(3) & """"
XMLOutput = XMLOutput + " p_id=""" & dbreader2.GetInt32(0) & """"
XMLOutput = XMLOutput + " cost=""" & dbreader2.GetDecimal(2) & """"
XMLOutput = XMLOutput + " >"
Next
Dim dbreader2 = cmd2.ExecuteReader()
While dbreader2.Read()
XMLOutput = XMLOutput + "<product"
XMLOutput = XMLOutput + " p_name=""" & dbreader2.GetString(3) & """"
XMLOutput = XMLOutput + " p_id=""" & dbreader2.GetInt32(0) & """"
XMLOutput = XMLOutput + " cost=""" & dbreader2.GetDecimal(2) & """"
XMLOutput = XMLOutput + " >"
End While