Vb.net 对象引用未设置为abject的实例
我的数据库查询正在运行,但我遇到错误“对象引用未设置为abject的实例” 我认为错误在这里,但我不知道如何解决它Vb.net 对象引用未设置为abject的实例,vb.net,Vb.net,我的数据库查询正在运行,但我遇到错误“对象引用未设置为abject的实例” 我认为错误在这里,但我不知道如何解决它 da.Fill(ds) If ds.Tables("TICKET_RESERVATION", "FLIGHT_DETAILS").Rows.Count > 0 Then txtTicketNo.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(0).ToString()
da.Fill(ds)
If ds.Tables("TICKET_RESERVATION", "FLIGHT_DETAILS").Rows.Count > 0 Then
txtTicketNo.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(0).ToString()
txtCustomerId.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(1).ToString()
txtFlightId.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(2).ToString()
txtAmount.Text = ds.Tables("FLIGHT_DETAILS").Rows(0).Item(3).ToString()
End If
这行有错误
If ds.Tables("TICKET_RESERVATION", "FLIGHT_DETAILS").Rows.Count > 0 Then
这就是问题所在:
Dim da As New OleDb.OleDbDataAdapter("SELECT TICKET.TICKET_NO,
TICKET.CUSTOMER_ID, FLIGHT.FLIGHT_ID, FLIGHT.FLIGHT_CHARGES
FROM TICKET_RESERVATION AS TICKET INNER JOIN
FLIGHT_DETAILS AS FLIGHT ON TICKET.FLIGHT_ID = FLIGHT.FLIGHT_ID
WHERE [TICKET.TICKET_NO]= '" & txtTicketNo.Text & "'", con)
Dim ds As New DataSet
da.Fill(ds)
If ds.Tables("TICKET_RESERVATION", "FLIGHT_DETAILS").Rows.Count > 0 Then
DataAdapter
不会将结果解析到单独的表中,因此您的DataSet
不会有DataTable(“机票预订”)
或DataTable(“航班详情”)
。第二个字符串实际上代表一个名称空间,因此由于该名称空间中没有该名称的表,因此代码引用的是空对象
.Fill
是一个返回受影响行数的函数,因此您可以测试:
Dim NumRows = da.Fill(ds)
If NumRows Then...
test.Rows.Count
或'NumRows,因为WHERE子句可以创建空的
DataTable`(没有与条件匹配的行)。然后,只需参考第一个表:
If NumRows Then...
txtTicketNo.Text = ds.Tables(0).Rows(0).Item(0).ToString
请注意,在WHERE子句可能返回多行的情况下,代码会任意使用第一行。即使使用“TicketNumber”,这可能是唯一的,也可能是唯一的航空公司。由于原始用户输入知道其中的内容(因为标准来自用户输入,所以应该使用参数)
DataTables
可以有名称,但这些名称仅由您指定,这在您计划向数据集中添加其他名称时非常有用:
da.Fill(ds, "TICKET_RESERVATION")
这就是你在美国所做的。删除表名参数时,还应将其从其他引用中删除
因为只有一个表/结果集,而且它是一个临时数据集,所以没有真正的理由这样做 检查您的
数据集
是否为无
,然后检查行数
。当数据集
为空时,如果您检查其行数
它将给出错误,因为对象引用未设置为abject的实例
这是错误的,ds.Tables(“机票预订”、“航班详细信息”)
。你必须使用其中一种
ds.表格(“机票预订”)
或ds.表格(“航班详情”)
像这样试试
Try
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim da As New OleDb.OleDbDataAdapter(" SELECT TICKET.TICKET_NO,TICKET.CUSTOMER_ID,FLIGHT.FLIGHT_ID,FLIGHT.FLIGHT_CHARGES FROM TICKET_RESERVATION AS TICKET INNER JOIN FLIGHT_DETAILS AS FLIGHT ON TICKET.FLIGHT_ID = FLIGHT.FLIGHT_ID WHERE [TICKET.TICKET_NO]= '" & txtTicketNo.Text & "'", con)
Dim ds As New DataSet
da.Fill(ds)
If ds IsNot Nothing AndAlso ds.Tables("TICKET_RESERVATION", "FLIGHT_DETAILS").Rows.Count > 0 Then
txtTicketNo.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(0).ToString()
txtCustomerId.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(1).ToString()
txtFlightId.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(2).ToString()
txtAmount.Text = ds.Tables("FLIGHT_DETAILS").Rows(0).Item(3).ToString()
End If
con.Close()
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
移除
Try/Catch
并查看它在哪一行上爆炸,或者单步执行并调试它以找出原因。如果您发布堆栈跟踪也会有所帮助。如果数据集中返回的某个值为null,则在尝试使用.ToString()
强制转换该值时,将出现上述异常。在施法之前,你需要确保值不为NULL或空。非常感谢现在我的程序给了我正确的输出。谢谢。上帝保佑你
Try
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim da As New OleDb.OleDbDataAdapter(" SELECT TICKET.TICKET_NO,TICKET.CUSTOMER_ID,FLIGHT.FLIGHT_ID,FLIGHT.FLIGHT_CHARGES FROM TICKET_RESERVATION AS TICKET INNER JOIN FLIGHT_DETAILS AS FLIGHT ON TICKET.FLIGHT_ID = FLIGHT.FLIGHT_ID WHERE [TICKET.TICKET_NO]= '" & txtTicketNo.Text & "'", con)
Dim ds As New DataSet
da.Fill(ds)
If ds IsNot Nothing AndAlso ds.Tables("TICKET_RESERVATION", "FLIGHT_DETAILS").Rows.Count > 0 Then
txtTicketNo.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(0).ToString()
txtCustomerId.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(1).ToString()
txtFlightId.Text = ds.Tables("TICKET_RESERVATION").Rows(0).Item(2).ToString()
txtAmount.Text = ds.Tables("FLIGHT_DETAILS").Rows(0).Item(3).ToString()
End If
con.Close()
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try