-2
votes

Comment réparer une exception: impossible de lancer l'objet de type 'system.dbnull' to tapez 'system.byte []'

J'ai une table nommée TBLSTAff de laquelle la colonne nommée StaffImage a un type de données image autorisée à stocker NULL.Si l'utilisateur fournit sa photo puis cette colonne stockera l'image comme des données binaires et s'il ne fournit pas son image puis Va stocker Null Value.Si cette colonne a une valeur nulle, l'image du dossier de ressources doit être affichée dans Imagebox1 et si cette colonne a des données binaires, l'image stockée dans cette colonne sous forme de données binaires doit être affichée dans Picturebox1.

    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();


0 commentaires

3 Réponses :


0
votes

Cette exception de "Impossible de lancer l'objet de type" System.DBnull "à Taper XXX" est correcte et c'est aussi assez simple, car la valeur de colonne que vous essayez de convertir de Datarow est dbnull.

Si vous êtes Lecture des lignes de DataTable, vous devez toujours vérifier DBNULL si la colonne est saisie comme une colonne nullable. p>

Par exemple, le code doit être comme celui-ci: p>

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


0 commentaires

1
votes

Impossible de lancer l'objet de type 'system.dbnull' to tapez system.byte []

Votre exception est issue de cet appel ci-dessous: xxx

Il se produit à partir de ceci: xxx

vous essayez Pour lancer un system.dbnull sur system.byte [] , cela ne fonctionne pas. Vous devez d'abord vérifier cette valeur, s'il vous plaît voir ci-dessous.

Remarque: il y a plus que un moyen de vérifier cela aussi xxx

Approche alternative suggérée par @madreflection: xxx


1 commentaires

Aucun point dans l'offre d'une réponse concurrente depuis que cela est déjà assez bon, je vais donc offrir ceci: var img = ds.tables [0]. Tries [0] .field (0); / Code> Le champ La méthode de l'extension est-ce que vous vérifiez (la mise en œuvre est réellement fascinante).



0
votes

comme réponse alternative et, étant donné que la colonne image de SQL Server a été obsolète, vous pouvez utiliser Varbinary (max) non null comme type de colonne et définir la valeur par défaut sur 0x.

De cette façon, vous récupérerez toujours au moins l'octet [0] de votre requête et n'aurez pas à vous soucier des contrôles DBNULL.


0 commentaires