Antwi Ответов: 3

Не удается привести объект типа 'System.система значение dbnull' в тип '.байт[]


Я молодой программист vb, я хочу получить данные из базы данных sql, она работает нормально, но когда я пытаюсь получить данные, которые были сохранены без изображения, это дает мне такую ошибку: невозможно привести объект типа 'System.DBNull 'to type' система.Байт[]


Это мой код:

Dim cmd As New SqlCommand("SELECT EmpID,Fname,Oname,Lname,Date_hired,Branch,Department,Grade,Pictures FROM Staff_Information WHERE EmpID = '" & txtempID.Text & "'", con)
      con.Open()
      Dim sdr As SqlDataReader = cmd.ExecuteReader()

      If sdr.HasRows Then
          While sdr.Read()

              txtfname.Text = sdr.Item("Fname").ToString
              txtothername.Text = sdr.Item("Oname").ToString
              txtlname.Text = sdr.Item("Lname").ToString
              dtpempl.Value = sdr.Item("Date_hired").ToString
              txtbranch.Text = sdr.Item("Branch").ToString
              txtdepartment.Text = sdr.Item("Department").ToString
              txtgrade.Text = sdr.Item("Grade").ToString

              Dim data As Byte() = DirectCast(sdr("Pictures"), Byte())
              Dim ms As New MemoryStream(data)
              PictureBox.Image = Image.FromStream(ms)

          End While
          sdr.Close()
          btnsearch.Enabled = False
          txtempID.ReadOnly = True
          btnclear.Enabled = True
      Else
          MsgBox("Staff ID: " & txtempID.Text & " " & "not found.")
          txtempID.Clear()
          txtempID.ReadOnly = False
          btnsearch.Enabled = False
          btnclear.Enabled = False
      End If
      con.Close()


Что я уже пробовал:

попробовал этот код:

If sdr("Pictures") IsNot System.DBNull Then
                   Dim data As Byte() = DirectCast(sdr("Pictures"), Byte())
                   Dim ms As New MemoryStream(data)
                   PictureBox.Image = Image.FromStream(ms)
               End If


но, система.DBNull подчеркнут красным и дает следующее сообщение:DBNull является классом и не может использоваться в качестве выражения

3 Ответов

Рейтинг:
1

Adersh M

Попробуйте Систему.Значение dbnull.Ценность. Как говорится в ошибке, система.DBNull-это класс, а Value-логическое свойство в нем.

If sdr("Pictures") IsNot System.DBNull.Value
  Dim data As Byte() = DirectCast(sdr("Pictures"), Byte())
  Dim ms As New MemoryStream(data)
  PictureBox.Image = Image.FromStream(ms)
End If


Рейтинг:
1

Richard Deeming

Начните с фиксации SQL-инъекция[^] уязвимость в вашем коде.

Вы также захотите обернуть объекты connection, command и data reader в Using блоки, чтобы убедиться, что они всегда очищены должным образом.

Поскольку вы показываете результаты только для одной записи, вам не нужен цикл для чтения записи.

Using con As New SqlConnection("...")
    Using cmd As New SqlCommand("SELECT EmpID, Fname, Oname, Lname, Date_hired, Branch, Department, Grade, Pictures FROM Staff_Information WHERE EmpID = @EmpID", con)
        
        cmd.Parameters.AddWithValue("@EmpID", txtempID.Text)
        
        con.Open()
        Using sdr As SqlDataReader = cmd.ExecuteReader()
            If sdr.Read() Then
                txtempID.ReadOnly = True
                txtfname.Text = Convert.ToString(sdr.Item("Fname"))
                txtothername.Text = Convert.ToString(sdr.Item("Oname"))
                txtlname.Text = Convert.ToString(sdr.Item("Lname"))
                dtpempl.Value = Convert.ToDateTime(sdr.Item("Date_hired"))
                txtbranch.Text = Convert.ToString(sdr.Item("Branch"))
                txtdepartment.Text = Convert.ToString(sdr.Item("Department"))
                txtgrade.Text = Convert.ToString(sdr.Item("Grade"))
                
                Dim pictureIndex As Integer = sdr.GetOrdinal("Pictures")
                If sdr.IsDBNull(pictureIndex) Then
                    PictureBox.Image = Nothing
                Else
                    Dim data As Byte() = DirectCast(sdr(pictureIndex), Byte())
                    Dim ms As New MemoryStream(data)
                    PictureBox.Image = Image.FromStream(ms)
                End If
            Else
                MsgBox("Staff ID: " & txtempID.Text & " " & "not found.")
                txtempID.Clear()
                txtempID.ReadOnly = False
            End If
        End Using
    End Using
End Using

btnsearch.Enabled = False
btnclear.Enabled = True


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]


Рейтинг:
0

Dominic Burford

Поэтому вам нужно проверить, является ли значение, возвращаемое из вашей БД, системным.Значение dbnull в первую очередь. Если это не система.DBNull тогда вы можете обрабатывать свои изображения как обычно.

If sdr("Pictures") IsNot System.DBNull
  Dim data As Byte() = DirectCast(sdr("Pictures"), Byte())
  Dim ms As New MemoryStream(data)
  PictureBox.Image = Image.FromStream(ms)
End If


Antwi

Система.DBNull подчеркнут красным и дает следующее сообщение:DBNull является классом и не может использоваться в качестве выражения