Vb.net 对象引用未设置为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()

我的数据库查询正在运行,但我遇到错误“对象引用未设置为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()
            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