2016-07-22 4 views
0

Так что я работаю с изображениями в проекте, и мне нужно получить изображения из базы данных в приложение VB.Net, проблема в том, что при извлечении NULL в базе данных, он возвращает ошибку, что байты не должны быть нулевыми. Здесь есть статья, в которой указано, что «байты не должны быть пустыми», но я непосредственно передал данные из моей хранимой процедуры в свое приложение, например.Как проверить нулевые изображения в VB.net

Sub searchEmpPic(ByVal employeenumber As String) 

     Dim sqlcomm As New SqlCommand 
     Dim dt As New DataTable 
     Dim dta As New SqlDataAdapter 

     With sqlcomm 

      conn.Open() 
      .Connection = conn 
      .CommandText = "dbo.getEmpPic" 
      .CommandType = CommandType.StoredProcedure 
      .Parameters.AddWithValue("@eNum", employeenumber) 
      'error happens during DirectCast 
      If DirectCast(.ExecuteScalar, Byte()) Is Nothing Then 
       loadDefaultPic() 
       conn.Close() 
      Else 
       Dim imagedata As Byte() = DirectCast(.ExecuteScalar, Byte()) 
       Dim ms As New MemoryStream 
       ms.Write(imagedata, 0, imagedata.Length) 
       Me.pbEpic.BackgroundImage = Image.FromStream(ms, True) 
       pbEpic.BackgroundImageLayout = ImageLayout.Zoom 
       conn.Close() 
      End If 



      .Dispose() 
     End With 




    End Sub 

Как я могу решить эту проблему?

Это сохраненная Proc

ALTER procedure [dbo].[getEmpPic] 

@eNum as varchar(10) 

as 

begin 

    select isnull(employee_picture,0) from employee where employee_id = @eNum 

end 

ответ

1

NULL значения обрабатываются точно так же, независимо от того, что тип данных вы работаете с в базе данных. Когда вы запрашиваете базу данных, вы либо получите значение ожидаемого типа, либо, если поле базы данных равно NULL, вы получите DBNull.Value. Как определить, что зависит от того, что вы делаете, но в случае ExecuteScalar вы могли бы сделать это:

'result will be type Object as that is what ExecuteScalar returns.' 
Dim result = myCommand.ExecuteScalar() 

If result Is DBNull.Value Then 
    'The database produced NULL so there is no value.' 
    '...' 
Else 
    Dim value = DirectCast(result, Byte()) 

    'Use value here.' 
End If 

Другим вариантом был бы:

Dim value = TryCast(myCommand.ExecuteScalar(), Byte()) 

If value Is Nothing Then 
    'The database did not produce a Byte() so the field was NULL.' 
    '...' 
Else 
    'Use value here.' 
End If 

Во втором случае value будет предполагается, что это тип Byte(), но будет Nothing, если ExecuteScalar не возвращает объект такого типа.

+0

Я использовал ваш первый вариант, у меня были проблемы, потому что есть ошибка, которая утверждает, что параметр недействителен в строке «Me.pbEpic.BackgroundImage = Image.FromStream (ms, True)» Я удалил функцию isnull в моей хранимой процедуре , теперь он работает хорошо! – UserSeriously

+0

Я исправил его, извините за итерации! – UserSeriously

Смежные вопросы