VB.Net) с использованием считывателя данных условий в таблицах соединений

Я пытаюсь собрать данные из присоединяющейся таблицы, и в настоящее время отображается нулевое значение (ошибка не найдена). Я думаю, что мой код недостаточно эффективен. Но вот что я пытаюсь:

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

эта проблема

Я думаю, что все поймут, посмотрев код. Я не могу объяснить многое, потому что мой английский недостаточно хорош.

1 ответ

Решение
... from tabsen join tsiswa on ...

Это создает внутреннее объединение для двух таблиц, которое дает результаты только в том случае, если обе таблицы имеют совпадающие данные.

Используйте либо Right (Outer) Join

... 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. Даст вам некоторые ошибки компиляции, но избавит вас от множества ошибок в будущем.

Другие вопросы по тегам