IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Communication Foundation .NET Discussion :

Service WCF et champ varbinary(max) [Débutant]


Sujet :

Windows Communication Foundation .NET

  1. #1
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut Service WCF et champ varbinary(max)
    Bonjour tout le monde , je développe une appliaction web silverlight avec service WCF et j'ai une table qui contiebnt un champ varbinary , pour afficher ce champ sur mon Usercontrol pas de soucis le probléme vient quand j'essaye d'enregistrer de mon appliaction vers la base SQL server car j'utilise cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
      [OperationContract]
                public string Commande(string Requete_Select)
                {
                    ConnectionStringSettings objConnectionStringSettings = ConfigurationManager.ConnectionStrings["TidjaraBaseConnectionString"];
                    Chaine_De_Conenxion = objConnectionStringSettings.ConnectionString;
     
                    try
                    {
                        using (SqlConnection connection = new SqlConnection(Chaine_De_Conenxion))
                        {
                            SqlCommand command = new SqlCommand(Requete_Select, connection);
                            command.Connection.Open();
                            command.ExecuteNonQuery();
                        }
                    }
                    catch (SqlException ex)
                    {
                        return ex.Message;
                    }
                    return "";
                }
    et je construit ma requete sous format string et quand j'essaye de mettre la valeur de ce champ j'ai System.Byte[] dans le Set

    que dois je faire svp? merci d'avance de vos réponses

  2. #2
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    ce que j'ai trouvé sur le web et ça fait des jours que je cherche c'est avec RIA services et ou bien une instruction SQl avec BULK sauf que je ne peux pas accéder au path du fichier sinon j'ai une exception de sécurité je vous en conjure aider moi je n'ai rien trouvé la

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par lila23 Voir le message
    et je construit ma requete sous format string et quand j'essaye de mettre la valeur de ce champ j'ai System.Byte[] dans le Set
    Peut-on voir comment tu fais ?

  4. #4
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    string Afectations = "";
                    string Condition = "";
                    var Liste_Proprietes_Brutes = _Type_Pere.GetProperties();
                    var Dico = global.Types[Table_Pere];
                    foreach (var p in Liste_Proprietes_Brutes)
                    {
                        if (Dico.ContainsKey(p.Name))
                        {
                            if (Identifiant_Pere.Contains(p.Name))
                            {
                                var v = p.GetValue(_Pere_Courant, null);
                                Condition += "AND (" + p.Name + " = '" + v.ToString() + "')";
                            }
                            else
                            {
                                if (true)
                                {
                                    var v = p.GetValue(_Pere_Courant, null);
                                    var dico = Dico[p.Name];
    // c'est la qu'il va rentrer pour mon champ varbinary
                                    if (Dico[p.Name] == "")
                                    {
     
                                        Afectations += "," + p.Name + " = " + "'" + v +")" ;
                                    }
                                    else
                                    {
                                        string Veleur = v.ToString();
                                        if (Dico[p.Name] == "System.Decimal") Veleur = Veleur.Replace(",", ".");
                                        else if (Dico[p.Name] == "System.String") Veleur = Veleur.Replace("'", "''");
                                        Afectations += "," + p.Name + " = " + "'" + Veleur + "'";
                                    }
                                }
                            }
                        }
                    }
     
                    _Commandes_Sql += "\n";
                    _Commandes_Sql += "UPDATE " + Table_Pere + " SET " + Afectations.Substring(1) + " WHERE " + Condition.Substring(3) + "\n";
                    _Commandes_Sql += "SET @error = @error + @@error\n";
                    _Commandes_Sql += "\n";
    ensuite j'execute ce batch via une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       public void Exec_CMD(string Commande)
                {
                    ServiceWCFClient S = new ServiceWCFClient();
                    S.Endpoint.Binding.OpenTimeout = TimeSpan.FromMinutes(10);
                    S.CommandeCompleted += new EventHandler<CommandeCompletedEventArgs>(S_CommandeCompleted);
                    S.CommandeAsync(_Instruction_Use + Commande);
                }
                void S_CommandeCompleted(object sender, CommandeCompletedEventArgs e)
                {
                    Exec_CMDCompleted(e.Result);
                }
    mais le champ varbinary sa valeur est égale à System.byte[]

    y a t'il une autre facon pour sauvegarder ce genre de type de données via WCF ? merci encore

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par lila23 Voir le message
    y a t'il une autre facon pour sauvegarder ce genre de type de données via WCF ? merci encore
    Il y a 2 problèmes :
    • Tu n'utilises pas les requêtes paramétrées
    • Le problème est que tu utilises très mal WCF. ça me rappelle un projet sur lequel j'avais travaillé où tous les paramètres en entrée étaient en string comme tu le fais actuellement. Vu que ton objet est complexe pourquoi ne pas créer un contrat de données qui sera passer en paramètres à ton opération WCF et après côté serveur tu effectues tout le traitement (génération de la requête vu que c'est ce que tu fais) que tu fais actuellement côté client.

  6. #6
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    je viens de faire une méthode qui a pour paramétre object
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    [OperationContract]
                public string SqlCommandPrepareEx(object dossier)
                {
     
                    ConnectionStringSettings objConnectionStringSettings = ConfigurationManager.ConnectionStrings["TidjaraBaseConnectionString"];
                    Chaine_De_Conenxion = objConnectionStringSettings.ConnectionString;
     
                    try
                    {
         // j'ai laissé vide juste pour tester
     
                    }
                    catch (SqlException ex)
                    {
                        return ex.Message;
                    }
                    return "";
     
     
                }
    et la en exécutant j'ai cette exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Une erreur s'est produite en tentant de sérialiser le paramètre :dossier. Le message InnerException était « Le type « f4674cdb-5a4b-4cc6-bb1c-cd1fd2ad5d52__proxy » avec le nom de contrat de données « f4674cdb-5a4b-4cc6-bb1c-cd1fd2ad5d52__proxy:http://schemas.datacontract.org/2004/07/ » n‘est pas attendu. Ajoutez tous les types non connus statiquement à la liste des types connus, par exemple en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus qui est transmise à DataContractSerializer. ». Pour plus d'informations, voir InnerException.
    je crois qu'il ne reconnait pas le type de mon objet?

  7. #7
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    je n'utilises pas les types crées par le DBML par exemple j'ai une table DOSSIER sur sqlserver je n'utlises pas le TYPE DOSSIER crée par le DBML mais quand j'execute le SELECT sur cette table je construit un type qui représente tous les champs de cette table avec leur type j'avais fait çà pour faire des requêtes complexes avec jointure ou somme mais apparement à l'envoi de cet objet au service WCF il ne le reconnait pas

  8. #8
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    Effectivement quand j'ai fait ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        [OperationContract]
                public string SqlCommandPrepareEx(DOSSIER dossier)
                {
                }
    il ne m'a donné aucune erreur le malheure c'est que je peux pas procéder comme ca j'ai pas le type DOSSIER coté client puisque je crée mon propre objet

    SVP A L'AIDEEEEEEEEEEEE

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je ne comprend pas trop ce que tu veux faire. Tu utilises Linq To SQL et à voir ton code tu te mets à générer manuellement la requête à exécuter.

    Bref une recherche sur le net pour savoir comment insérer ou mettre à jour une entité avec Linq To SQL te permettra de savoir comment faire.

  10. #10
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    non je n'utilises pas du LinqToSql par exemple pour faire une COMMANDE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    [OperationContract]
                public string Commande(string Requete_Select)
                {
                    ConnectionStringSettings objConnectionStringSettings = ConfigurationManager.ConnectionStrings["TidjaraBaseConnectionString"];
                    Chaine_De_Conenxion = objConnectionStringSettings.ConnectionString;
     
                    try
                    {
                        using (SqlConnection connection = new SqlConnection(Chaine_De_Conenxion))
                        {
                            SqlCommand command = new SqlCommand(Requete_Select, connection);
                            command.Connection.Open();
                            command.ExecuteNonQuery();
                        }
                    }
                    catch (SqlException ex)
                    {
                        return ex.Message;
                    }
                    return "";
                }
    et coté client je construit ma commande INSERT par exemple tout cela car on m'avait demandé de pouvoir exécuter n'importe quel requête SELECT avec des jointures des champs calculés ... etc c'est pour cela que je crée moi mm le type de données puisque je ne sais pas ce qu'il ya dans le SELECT

    merci à vous j’espère être claire

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par lila23 Voir le message
    je n'utilises pas les types crées par le DBML par exemple j'ai une table DOSSIER sur sqlserver je n'utlises pas le TYPE DOSSIER crée par le DBML ....
    DBML? c'est l'extension des fichiers utilisés par Linq To SQL.

    Donc plus clean tu dois mettre ton DBML côté serveur (WCF) côté client tu t'utilises des DTOs ou tous simplement les mêmes classes générées par le DBML.

  12. #12
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    il est vrai qu'au début j'ai utilisé linq ensuite ENTITY et je suis revenu vers WCF mais par exemple un SELECT s'effectue comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     private static Dictionary<Dictionary<string, string>, List<string[]>> _Select(string Requete_Select)
                {
                    ConnectionStringSettings objConnectionStringSettings = ConfigurationManager.ConnectionStrings["TidjaraBaseConnectionString"];
                    Chaine_De_Conenxion = objConnectionStringSettings.ConnectionString;
     
                    Dictionary<Dictionary<string, string>, List<string[]>> DicoType_Resultat = new Dictionary<Dictionary<string, string>, List<string[]>>();
     
                    using (SqlConnection connection = new SqlConnection(Chaine_De_Conenxion))
                    {
                        SqlCommand command = new SqlCommand(Requete_Select, connection);
                        command.Connection.Open();
                        SqlDataReader reader = command.ExecuteReader();
                        int NbrColonnes = reader.FieldCount;
     
                        //--------------------------------------------------------------------------
                        Dictionary<string, string> DicoType = new Dictionary<string, string>();
                        for (int i = 0; i < NbrColonnes; i++)
                        {
                            DicoType.Add(reader.GetName(i), reader.GetFieldType(i).ToString());
                        }
                        //--------------------------------------------------------------------------
     
                        //--------------------------------------------------------------------------
                        List<string[]> Resultat = new List<string[]>();
                        while (reader.Read())
                        {
                            string[] ligne = new string[NbrColonnes];
                            for (int i = 0; i < NbrColonnes; i++)
                            {
                                ligne[i] = reader[i].ToString();
                            }
                            Resultat.Add(ligne);
                        }
                        //--------------------------------------------------------------------------
                        reader.Close();
                        DicoType_Resultat.Add(DicoType, Resultat);
                    }
     
                    return DicoType_Resultat;
                }
    je remplie des dictionnaire avec les types de champs leur noms ensuite leur valeurs ce qui me construit mon propre type de données maintenant comment faire pour enlever l'exception et que je puisse passer ce genre d'objet à mon service un service WCF n'accepte pas tous les types d'objets en paramétre? merci à vous encore

  13. #13
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    j'ai essayé de faire une méthode dans mon service avec un string en paramètre et de convertir mon image System.Byte[] en string et de l'envoyer à cette méthode mais la ma méthode ne marche pas j'ai une erreur par contre bien-sure si j'envoie " " cela marche bien est ce un problème de taille voici la méthode qui d'un tableau me renvoie un string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     private String BuildByteArrayString(Byte[] array)
            {
                StringBuilder sb = new StringBuilder(array.Length * 8);
     
                foreach (Byte currentByte in array)
                {
                    sb.AppendFormat("[0x{0:X4}]", currentByte);
                }
     
                return sb.ToString();
            }
    svp j'en peux plus de ce problème aidez moi merci

  14. #14
    Débutant Avatar de lila23
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 54
    Points
    54
    Par défaut
    en fin de compte j'ai pu envoyer un mon image mais par paquet c'était un probléme de taille j'ai du découper mon image en plusieurs paquets!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recuperer un champ varbinary(MAX)
    Par Msysteme dans le forum C#
    Réponses: 2
    Dernier message: 19/10/2009, 16h23
  2. Appli utilisant Service WCF
    Par cquadjul dans le forum Windows Communication Foundation
    Réponses: 3
    Dernier message: 11/04/2007, 16h40
  3. [reporting services] Somme des champs
    Par Wells dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/08/2006, 11h28
  4. Réponses: 7
    Dernier message: 27/06/2006, 20h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo