0

我正在尝试从加入表中收集数据,目前显示为空(未发现错误)。我认为我的代码效率不高。但这是我正在尝试的:

conn.Open()
    sqlcmd = New MySqlCommand("select tabsen.id_absen, tsiswa.NIS, tsiswa.nama, tabsen.alpa, tabsen.izin, tabsen.sakit, tabsen.tahun_ajaran from tabsen join tsiswa on tabsen.NIS = tsiswa.NIS where tsiswa.NIS like '%" & txtnis.Text & "%'", conn)
    dr = sqlcmd.executereader()
    dr.Read()
    If dr.HasRows Then

        txtid.Text = dr.Item("id_absen")
        txtnis.Text = dr.Item("NIS")
        txtnama.Text = dr.Item("nama")
        txta.Text = dr.Item("alpa")
        txti.Text = dr.Item("izin")
        txts.Text = dr.Item("sakit")
        cmbtahun.Text = dr.Item("tahun_ajaran")
        txta.Focus()
        btnsave.Text = "UPDATE"
        btndelete.Enabled = True
        txtjumlah.Enabled = True
        cmbpredikat.Enabled = True
        cmbtahun.Enabled = True
        txtnis.Enabled = False
        dr.Close()

    Else
        While dr.Read()
            txtnama.Text = dr("nama")
        End While
        dr.Close()
        MsgBox("data absensi belum diisi")
    End If
    conn.Close()

如果找到行,它就像一个魅力。但是当它在表“tabsen”上为空时,没有错误,但 txtnama.Text 没有显示他们的“nama”。

问题

我想大家看代码就明白了。我无法解释太多,因为我的英语不够好。

4

1 回答 1

0
... from tabsen join tsiswa on ...

这会在两个表上产生一个内部连接,只有两个表都有匹配的数据时才会提供结果。

使用右(外)连接

... from tabsen right join tsiswa on ...

左(外)连接

... from tsiswa left join tabsen on ...

话虽如此,请注意,如果tabsen不包含匹配的行,则其所有属性都是NULL值。
因此,在将数据读取器中的值分配给文本框时,您必须检查:

Dim id_absen = dr.Item("id_absen") 
txtid.Text = If(id_absen<> DBNull.Value, id_absen.ToString(), String.Empty)
...

顺便说一句...我建议您将其设置Option Strict On在 VB 文件的最顶部。会给你一些编译错误,但将来会为你节省很多卑鄙的错误。

于 2017-03-20T17:54:28.907 回答