Как исправить исключение: невозможно привести объект типа «System.DBNull» к типу «System.Byte []» - PullRequest
0 голосов
/ 17 октября 2019

У меня есть таблица с именем tblStaff, столбец с названием staffImage имеет тип данных Image, которому разрешено сохранять значение Null. Если пользователь предоставит свою фотографию, то в этом столбце будет сохранено изображение в виде двоичных данных, а если он не предоставит свое изображение, то онобудет хранить нулевое значение. Если этот столбец имеет нулевое значение, тогда изображение из папки Resource должно отображаться в pictureBox1, а если в этом столбце есть двоичные данные, то изображение, хранящееся в этом столбце в виде двоичных данных, должно отображаться в pictureBox1.

CREATE TABLE tblStaff
(
    staffId int not null identity Primary Key,
    staffName varchar(50) not null,
    staffUserName varchar(25) not null,
    staffPassword varchar(30) not null,
    staffPhone varchar(15) not null,
    staffRole int not null,
    staffStatus tinyint not null,
    **staffImage image**
)

see column name

    ALTER PROC [dbo].[sp_GetStaffImage]
    @staffId varchar(150)
    as
    SELECT Stf.staffImage as 'Image' FROM tblStaff Stf WHERE 
    staffID=@staffId


.
.
.
.

string staffID = Convert.ToString(dataGridViewStaff.Rows[e.RowIndex].Cells["Staff Id"].Value);
..............
.............
..........
...........

SqlConnection con1 = new SqlConnection(cs);
con.Open();
SqlCommand cmd1 = new SqlCommand("sp_GetStaffImage", con);
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.AddWithValue("@staffId", staffID);
SqlDataAdapter sda1 = new SqlDataAdapter(cmd1);
DataSet ds = new DataSet();
sda1.Fill(ds);

if(ds.Tables[0].Rows.Count>0)
{
   var img = (byte[])ds.Tables[0].Rows[0][0];

   if (img != Null) //code if the data in column named staffImage is 
                    Binary data then show the image                        
                    in PictureBox1 from the database.
   {

         MemoryStream ms = new MemoryStream(img);
         pictureBox1.Image = new Bitmap(ms);
   }
   else  //code if the data in column named staffImage is Null then show the image in PictureBox1 
           from Resource folder .
   {
       pictureBox1.ImageLocation = "Resources/human.png";
   }

}
con.Close();

Запустив приведенный выше код, я получил следующее исключение: Невозможно привести объект типа 'System.DBNull'набрать' System.Byte [] '.

Ответы [ 3 ]

1 голос
/ 17 октября 2019

Невозможно привести объект типа 'System.DBNull' к типу 'System.Byte []

Ваше исключение вытекает из этого вызова ниже:

 var img = (byte[])ds.Tables[0].Rows[0][0];

Это происходит из-за этого:

 ds.Tables[0].Rows[0][0] // This is DBNull, you can't cast it to byte[]

Вы пытаетесь разыграть System.DBNull в System.Byte[], который не работает. Сначала вам нужно проверить это значение, см. Ниже.

Примечание: есть еще , чем , один способ проверить это также

 var img = ds.Tables[0].Rows[0][0] == DbNull.Value ? null : (byte[])ds.Tables[0].Rows[0][0];

Альтернативный подход, предложенный @Madreflection:

 var img = ds.Tables[0].Rows[0].Field<byte[]>(0);
0 голосов
/ 17 октября 2019

В качестве альтернативного ответа и поскольку тип столбца IMAGE в SQL Server устарел, вы можете использовать VARBINARY (MAX) NOT NULL в качестве типа столбца и установить значение по умолчанию 0x.

Таким образом, вы всегда будете получать по крайней мере байт [0] от вашего запроса и вам не придется беспокоиться о проверках DBNull.

0 голосов
/ 17 октября 2019

Это исключение из "Невозможно привести объект типа 'System.DBNull' к типу xxx" является правильным и также довольно простым, поскольку значение столбца, которое вы пытаетесь преобразовать из DataRow, равно DbNull.

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

Например, код должен быть таким:

 var img = (byte[])(ds.Tables[0].Rows[0][0] == DbNull.Value ? null : ds.Tables[0].Rows[0][0]);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...