VB.Net) 在连接表上使用条件数据 reader

VB.Net) using condition data reader on join tables

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

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()

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

the problem

我想大家看代码就明白了。我的英文不太好,没法解释太多。

... from tabsen join tsiswa on ...

这会在两个表上生成一个 Inner Join,只有当两个表都有匹配数据时才会提供结果。

使用 Right (Outer) Join

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

Left (Outer) Join

... 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)
...

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