ВЫБОР данных из базы данных в vb и вывод данных в метку - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть следующий код, который ВЫБИРАЕТ данные из базы данных и выводит значение в метку на форме:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click


        Dim strConn As String = System.Configuration.ConfigurationManager.ConnectionStrings("yourConnectionString").ToString()
        Dim sql As String = "SELECT aid FROM tbl_RAPA WHERE username=@username"
         Dim conn As New Data.SqlClient.SqlConnection(strConn)
        Dim objDR As Data.SqlClient.SqlDataReader
        Dim Cmd As New Data.SqlClient.SqlCommand(sql, conn)


        Cmd.Parameters.AddWithValue("@username", User.Identity.Name)
        conn.Open()
        objDR = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
        While objDR.Read()
            Label1.Text = objDR("aid")
        End While
    End Sub

Однако, если значение в базе данных пусто, программа запускается в ошибка. Есть ли способ сделать это, чтобы программа просто возвращала пустое значение, а не вылетала?

Мне выдается сообщение об ошибке System.InvalidCastException: 'Unable to cast object of type 'System.DBNull' to type 'System.Windows.Forms.Label'.' в строке Label1.Text = objDR("aid")

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Объекты базы данных, как правило, должны быть закрыты и удалены. Блоки Using...End Using сделают это за вас, даже если есть ошибка.

Поскольку вы ожидаете только один фрагмент данных, вы можете использовать .ExecuteScalar, который предоставляет первый столбец первой строки набора результатов. , Этот метод возвращает объект.

Старайтесь всегда использовать метод .Add с Parameters. См. http://www.dbdelta.com/addwithvalue-is-evil/ и https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ и еще один: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications Вот еще один https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html Я должен был угадать тип базы данных, поэтому проверьте в вашей базе данных действительное значение.

Не обновляйте интерфейс пользователя до тех пор, пока соединение не будет закрыто и опущено. (End Using). Я объявил aid перед блоком Using, чтобы его можно было использовать после блока. Проверьте, не является ли объект, aid, ничем, перед добавлением его в текст метки.

Imports MySql.Data.MySqlClient

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim aid As Object
    Using conn As New MySqlConnection(ConfigurationManager.ConnectionStrings("yourConnectionString").ToString),
            cmd As New MySqlCommand("SELECT aid FROM tbl_RAPA WHERE username=@username", conn)
        cmd.Parameters.Add("@username", MySqlDbType.VarChar).Value = User.Identity.Name
        aid = cmd.ExecuteScalar
        conn.Open()
    End Using
    If Not IsNothing(aid) Then
        Label1.Text = aid.ToString
    End If
End Sub
0 голосов
/ 03 февраля 2020

Я бы добавил это перед While objDR.Read() в качестве меры предосторожности, если ваш запрос не возвращает строк:

if objDR.HasRows
...

Затем, чтобы обработать нулевые значения (это, вероятно, то, что вы подразумеваете под пустым):

If Not String.IsNullOrEmpty(objDR.Item("aid")) Then
    Label1.Text = objDR("aid")
Else
    Label1.Text = "Null !"
End if

Вы также можете использовать ExecuteScalar(), если вы ожидаете только одну запись. Но вам нужно разобраться с ситуацией, когда не найдено ни одной подходящей записи.

...