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();
3 Réponses :
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]);
Impossible de lancer l'objet de type 'system.dbnull' to tapez system.byte [] p>
Votre exception est issue de cet appel ci-dessous: p>
xxx pré> Il se produit à partir de ceci: p>
xxx pré> vous essayez Pour lancer un
system.dbnull code> sursystem.byte [] code>, cela ne fonctionne pas. Vous devez d'abord vérifier cette valeur, s'il vous plaît voir ci-dessous. P>Remarque: il y a plus que em> un moyen de vérifier cela aussi p>
xxx pré> Approche alternative suggérée par @madreflection: p>
xxx pré> blockQquote>
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
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. p>
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. P>