Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau de Byte

LongBlob vers tableau de Byte

    22 juin 2020 à 12:33:12

    Salut le professionnel, j'ai une préoccupation à faire partager avec vous. J'ai une Propriété de type LongBlob dans ma base de données (MySQL) et dans mon application C# je veux récupérer les informations de ce type pour le placer dans ma propriétés de type tableau de byte (byte[])? Voici le codes:

    public byte[] TrouverPhotoReligieux(int religieuxId)
            {
                string requete = @"SELECT photo FROM religieux
                                    WHERE id = ?";
    
                byte[] fichierTrouver = null;
                using (IDbCommand cmd = this.Connexion.CreerCommande(requete))
                {
                   cmd.AddIntParameter(religieuxId);
                   using (IDataReader reader = cmd.ExecuteReader())
                   {
                       int indexPhoto = reader.GetOrdinal("photo");
                       while (reader.Read())
                       {
                           fichierTrouver = (byte[])reader.GetValue(indexPhoto);
                       }
                   }
                }
                return fichierTrouver;
            }
    Pendant l'execution, le reader.Read() est toujours à false, alors que les informations se trouve dans la base de données.
    • Partager sur Facebook
    • Partager sur Twitter
      22 juin 2020 à 13:37:36

      Je ne suis pas sûr que des trucs aussi archaïques que les DaraReader ne soient pas limité à 4Ko de données et ne supportent pas les Blob.

      Pourquoi ne pas utiliser un DataAdapter+DataSet ?

      -
      Edité par bacelar 22 juin 2020 à 13:37:50

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        23 juin 2020 à 16:37:18

        Merci pour vos réponses rapide, le problème n'est pas encore résolu. Je vais reprendre l'explication. J'ai un base de données (en MySQL) avec un table que j'ai appelé "Religieux". Et dans cette table la propriété photo (qui est de type LongBlob) est par défaut à Null. J'ai trois (3) informations (enregistrements) dont la dernière contient la photo et le deux précédente (enregistrement) ne contient rien (donc Null). Si je parcours les deux premières enregistrements, le HasRow du reader est à Vrai, alors que si je parcours l'enregistrement qui contient la photo, le HasRow du reader est toujours à False.

        Voici mes codes :

        public byte[] TrouverPhotoReligieux(int religieuxId)
                {
                    string requete = @"SELECT photo FROM religieux
                                        WHERE id = ?";
        
                    byte[] bytePhoto = null;
                    using (IDbCommand cmd = this.Connexion.CreerCommande(requete))
                    {
                        cmd.AddIntParameter(religieuxId);
                        using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                        {
                            while (reader.Read())
                            {
                                bytePhoto = (byte[])reader["photo"];
                            }
                        }
                    }
                    return bytePhoto;
                }



        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2020 à 16:57:17

          tu es sûr de la valeur de l'ID de cet enregistrement ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2020 à 17:33:55

            Je suis sûr. J'utilise l'architecture MVVM, et dans le metier voila comment je fais

            //Verifie si le chemin de la photo contient quelque chose
                        if (formIdentite.LienPhoto != null)
                        {
                            //Convertir le lien de la photo en Tableau de byte
                            religieux.Photo = File.ReadAllBytes(formIdentite.LienPhoto);
                        }
                        else
                        {
                            religieux.Photo = null;
                        }

            Ensuite dans le DAO

            public override void Inserer(Religieux entite)
                    {
                        string requete = @"INSERT INTO religieux (matricule, lieu_premier_voeux, date_premier_voeux, lieu_voeux_perp, date_voeux_perp, lieu_ordination, date_ordination, 
                                           lieu_deces, date_deces,photo, lien_photo,telephone_religieux, personne_id, paroisse_id )
                                           VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";
            
            
                        using (IDbCommand cmd = Connexion.CreerCommande(requete))
                        {
                            cmd.AddStringParameter(entite.Matricule);
                            cmd.AddStringParameter(entite.LieuPremierVoeux);
                            cmd.AddStringParameter(entite.DatePremierVoeux);
                            cmd.AddStringParameter(entite.LieuVoeuxPerpetuel);
                            cmd.AddStringParameter(entite.DateVoeuxPerpetuel);
                            cmd.AddStringParameter(entite.LieuOrdination);
                            cmd.AddStringParameter(entite.DateOrdination);
                            cmd.AddStringParameter(entite.LieuDeces);
                            cmd.AddStringParameter(entite.DateDeces);
                            cmd.AddBinaryParameter(entite.Photo); // Ajouter le tableau de byte dans la bdd
                            cmd.AddStringParameter(entite.LienPhoto);
                            cmd.AddStringParameter(entite.TelephoneReligieux);
                            cmd.AddIntParameter(entite.PersonneId);
                            cmd.AddIntParameter(entite.ParoisseId);
            
                            cmd.ExecuteNonQuery();
                        }
                        entite.Id = this.Connexion.DernierIdInsere();
                    }

            Avec ça ;

            SELECT rel.photo
            FROM religieux rel
            WHERE rel.id =13;

            Le 13 c'est l'id du religieux

            J'ai le données qui est impossible à lire. Je comprend (parce que c'est sont des Octet)

            et quand je vais récupérer à partir de l'id 13, c'est l'à que le HasRow du reader est à false



            • Partager sur Facebook
            • Partager sur Twitter
              23 juin 2020 à 17:41:55

              Je le répète, dégagez moi ces putains de DataReader.

              Il y a toute les chances que la configuration par défaut plus de 4Ko.

              Il faut des paramétrages spécifiques pour dépasser des enregistrements plus longs que ces 4Ko.

              Utilisez des DataAdapter.

              P.S.: sauf cas très particulier, il n'est pas judicieux de stocker les images DANS une base relationnelle.

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                24 juin 2020 à 11:06:43

                Merci bacelar, juste pour d'éclaircissement, le datareader fonctionne correctement pour d'autres champs (pour le nom par exemple), mais si j'ai fais pour la photo cela que le HasRows du reader est à false.

                Pour ta deuxième proposition (qui est de mettre le images à l'extérieur de la base) l'application est client serveur, l'idée que j'avais est de créer un répertoire dans le serveur, pour loger le photos, et la base conserve seulement le chemin vers la photo, maintenant, je me dis, comment faire pour récupérer le chemin de l'image dans le réseau ? Pour que l'utilisateur aïe la photo sur sa machine.

                • Partager sur Facebook
                • Partager sur Twitter
                  24 juin 2020 à 11:33:36

                  >le datareader fonctionne correctement pour d'autres champs

                  Oui, mais la somme de la longueur de vos champs ne dépasse pas 4Ko.

                  Le DataReader ne se justifie que dans de très rare cas.

                  Ironiquement, votre cas est assez proche de l'un de ces cas : coût de rapatriement de toutes les données très élevé. (Je parle du cas où vous retournez un jeu d'enregistrement où chaque enregistrement devrait rapatrier toute l'image.)

                  Mais son utilisation dans ces cas demande de nombreux réglages, ce qui demande une très bonne connaissance de ses limites.

                  Donc, le DataReader n'est pas la manière "standard" de rapatrier des données, et ce depuis au moins .NET2.0 (facile 12ans), donc, si vous l'avez vue dans un apprentissage, il pue la naphtaline.

                  Mais tout cela n'a plus lieu d'être si l'image n'est plus dans la base.

                  Pour la problématique de l'accès à l'image, le plus répandu, c'est de mettre ces images accessibles via un protocole réseau comme HTTP.

                  En résumé, vous stockez dans la base, non pas le chemin dans le système de fichier mais l'URL d'accès à ce fichier.

                  Cela implique la mise en place d'un serveur Web, mais bon, c'est le truc de base de tout système Client/Serveur moderne.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                  Tableau de Byte

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown