1
votes

Erreur C #: impossible d'insérer l'enregistrement dans SQL

Veuillez pardonner mes connaissances sur C # car je suis très nouveau dans ce domaine, je suis incapable d'insérer un enregistrement en SQL et d'obtenir l'erreur ci-dessous lors de l'insertion d'une image dans SQL. Erreur:

La référence d'objet n'est pas définie sur une instance d'un objet.

MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] img = ms.ToArray();

if (img == null)
{
    com.Parameters.AddWithValue("@img", null);
}
else
{
    com.Parameters.AddWithValue("@img", img);
}

Si je sélectionne une image et l'insère avec succès, mais si je ne sélectionne pas une image, l'erreur ci-dessus est générée. S'il vous plaît aider !!


6 commentaires

dans quelle ligne avez-vous l'exception NullReferenceException? et pourquoi êtes-vous si sûr que votre pictureBox1 a une image, et que cette image a un RawFormat? avez-vous vérifié cela quelque part ci-dessus dans le code?


AddWithValue doit déduire le type de paramètre en fonction de la valeur passée. Puisque vous passez null , il ne peut pas déduire le type de paramètre et génère une erreur. La meilleure solution est de ne pas utiliser AddWithValue et de saisir explicitement votre paramètre. Plus de lecture: Pouvons-nous arrêter d'utiliser AddWithValue () déjà? , AddWithValue is Evil


Le message d'exception indique qu'il est lié au code c #, de sorte que l'exception peut se produire ici: pictureBox1.Image.Save (ms, pictureBox1.Image.RawFormat); lorsque pictureBox1.Image est nul


@GarethD Oui, il ne doit pas être utilisé, et oui, il génère une erreur mais pas un NRE. C'est une requête paramétrée attend .....


@Steve, assez juste, j'ai fait une hypothèse sans vérification, je suis corrigé et l'utilisation de AddWithValue n'est pas la cause de l'exception lancée. Je m'attendrais maintenant à ce que la ligne de problème soit ici alors: pictureBox1.Image.Save (ms, pictureBox1.Image.RawFormat); , si vous ne sélectionnez pas une image, pictureBox.Image sera nul, ce qui signifie que vous ne pouvez pas appeler la méthode Save () sur l'image.


Est-ce que cela répond à votre question? Qu'est-ce qu'une exception NullReferenceException et comment y remédier?


3 Réponses :


3
votes

Modifiez ceci:

MemoryStream ms = new MemoryStream();
pictureBox1?.Image?.Save(ms, pictureBox1?.Image?.RawFormat);
byte[] img = ms.ToArray();
com.Parameters.AddWithValue("@img", (object)img ?? DBNull.Value);

À ceci

MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] img = ms.ToArray();
if (img == null)
{
     com.Parameters.AddWithValue("@img", null);
}
else
{
     com.Parameters.AddWithValue("@img", img);
}


2 commentaires

L'erreur dit l'opérateur ?? ne peut pas être appliqué aux opérandes de type byte []


Fonctionne-t-il avec com.Parameters.AddWithValue ("@ img", img);



2
votes

Essayez de tester que PictureBox1.Image existe avant de la référencer, comme ceci:

        if (pictureBox1.Image != null)
        {
            MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
            byte[] img = ms.ToArray();
            com.Parameters.AddWithValue("@img", img);
        }
        else
        {
            com.Parameters.Add("@img", SqlDbType.VarBinary, 0).Value = DbNull.Value;
        }

MODIFIÉ pour inclure le commentaire de GarethD


3 commentaires

com.Parameters.AddWithValue ("@ img", null); lancera toujours une erreur, il serait préférable de déclarer explicitement le type de paramètre, par exemple com.Parameters.Add ("@ img", SqlDbType.VarBinary, 0) .Value = DbNull.Value; ou com.Parameters.Add ("@ img", SqlDbType.VarBinary, 0) .Value = img; (selon le côté du si vous vous trouvez)


Merci, @GarethD. J'ai mis à jour ma réponse en conséquence


Superbe cela fonctionne !! Merci à tous ... beaucoup apprécié pour toute l'aide.



0
votes

Tout d'abord, vous devez créer une nouvelle condition pour vérifier si le fichier est sélectionné ou non. Voici le code ci-dessous:

if pictureBox1.hasfile == true 
{
                    MemoryStream ms = new MemoryStream();
                    pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
                    byte[] img = ms.ToArray();

                    if (img == null)
                    {
                        com.Parameters.AddWithValue("@img", null);
                    }
                    else
                    {
                        com.Parameters.AddWithValue("@img", img);
                    }
}

car vous ne sélectionnez aucun fichier, c'est pourquoi il lance une exception à l'exécution


0 commentaires