Bonjour à tous,

Ma WebMethod DbRequest doit (avec l'aide d'un retour de requête SQL) retourné ceci:
<FProjectStructureTable>
<TProjectStructure>
<FE01PRJCOD>0000000000</FE01PRJCOD>
<FE01PRJDEB>2009-05-22 00:00:00</FE01PRJDEB>
...
</TProjectStructure>
<TProjectStructure>
<FE01PRJCOD>TEST</FE01PRJCOD>
<FE01PRJDEB>2009-05-26 00:00:00</FE01PRJDEB>
...
</TProjectStructure>
</FProjectStructureTable>

où dans le fond:
FProjectStructureTable est une classe contenant des tableaux de structure de chaque lignes de mon retour de requete.
TProjectStructure est une classe contenant les données de mes colonnes (champs)
FE01PRJCOD, FE01PRJDEB sont des champs de ma BD

jusque là, c'est simple, seulement il faut aussi que la structure soit dynamique peut importe le retour de la requête SQL et que les balise aie le nom de mes champs de ma base de donnée. Donc, je ne peut pas utiliser de classe statique.

Est-ce que vous avez une idée comment procéder?

Si vous avez besoin de plus d'informations, demandez en. C'est très important pour la réussite du projet de l'entreprise dans laquelle de travaille.

Merci beaucoup de votre aide!

Michel


Note:
Voila ce à quoi j'ai pensé:

Ma [WebMethod] DbRequest doit retourner un tableau de tableau d'"Object" étant en fait les lignes et colonnes d'un retour de requête SQL.

J'utilise ici le type "Object" car chacun des champs de retour SQL on un type différents.

Mes différents retour de requête générant des tables différentes, je ne peut pas me faire de "class" statique.

J'ai donc décider de créer une fonction qui génèreras une "class" selon le tableau qui lui est donner lors de l'exécution (le code seras fourni plus bas).

Le problème à mon niveau est lors du retour de la fonction DbRequest. Ma classe dynamique n'étant pas connu à la compilation, je reçoit une erreur lors du retour de la fonction:
System.InvalidOperationException: Erreur lors de la génération du document XML. ---> System.InvalidOperationException: Le type TMyClass n'était pas attendu. Utilisez l'attribut XmlInclude ou SoapInclude pour spécifier les types qui ne sont pas connus statiquement.
Bien évidemment, tout ce processus peu s'avérer inutile si vous me trouver une manière pour que ma WebMethod retourne un réponse du type:
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
 
<FProjectStructureTable>
   <TProjectStructure>
      <FE01PRJCOD>0000000000</FE01PRJCOD>
      <FE01PRJDEB>2009-05-22 00:00:00</FE01PRJDEB>
      ...
   </TProjectStructure>
   <TProjectStructure>
      <FE01PRJCOD>TEST</FE01PRJCOD>
      <FE01PRJDEB>2009-05-26 00:00:00</FE01PRJDEB>
      ...
   </TProjectStructure>
</FProjectStructureTable>
 
au lieu de
 
<ArrayOfAnyType>
   <anyType xsi:type="ArrayOfAnyType">
      <AnyType xsi:type="string">0000000000</AnyType>
      <AnyType xsi:type="DateTime">2009-05-22 00:00:00</AnyType>
      ...
   </anyType>
   <anyType xsi:type="ArrayOfAnyType">
      <AnyType xsi:type="string">TEST</AnyType>
      <AnyType xsi:type="DateTime">2009-05-26 00:00:00</AnyType>
      ...
   <anyType>
<ArrayOfAnyType>
Voici mon code de génération de classe en Runtime:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
        public Object GenerateDynamicClass(AdsExtendedReader oExtendedReader, String AClassName)
        {
            int mColCount = oExtendedReader.GetRecordCount(AdsExtendedReader.FilterOption.IgnoreFilters);
            int iColCount;
 
            string mCode =
                "using System;" +
                "using System.Web.Services;" +
                //"[XmlIgnore]" +
                "public class " + AClassName + //":TCIWebService.CTRL_SMIGG.TMyMasterClass" +
                "{";
                    for (iColCount = 0; iColCount < mColCount; iColCount++)
                    {
                        mCode = mCode + "public " + ConvertType(oExtendedReader.GetFieldType(iColCount)) + " F" + oExtendedReader.GetName(iColCount) + ";"; 
                    }
                    mCode = mCode +
                    "public " + AClassName + " () { }" +
                    "public void SetField(string AFieldName, Object AValue)" +
                    "{" +
                        "switch (AFieldName)" +
                        "{";
                            for (iColCount = 0; iColCount < mColCount; iColCount++)
                            {
                            mCode = mCode +
                            "case \"" + oExtendedReader.GetName(iColCount) + "\":" +
                                "F" + oExtendedReader.GetName(iColCount) + " = (" + oExtendedReader.GetFieldType(iColCount) + ")AValue;" +
                                "break;";
                            }
                            mCode = mCode +
                            "default:" +                          
                                "break;" +
                        "}" +
                    "}" +
                "}";
 
            string mTypeName = AClassName;
            Microsoft.CSharp.CSharpCodeProvider oCompiler = new Microsoft.CSharp.CSharpCodeProvider();
            CompilerParameters oCompilerParams = new CompilerParameters(new string[] { "System.dll" });
            oCompilerParams.ReferencedAssemblies.Add(@"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Configuration.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.EnterpriseServices.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Web.Extensions.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Web.Extensions.Design.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.Mobile.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.Services.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll");
            oCompilerParams.ReferencedAssemblies.Add(@"D:\Projets\TCIWebService\TCIWebService\TCIWebService\bin\TCIWebService.dll");
            CompilerResults oResults = oCompiler.CompileAssemblyFromSource(oCompilerParams, new string[] { mCode });
 
            return oResults.CompiledAssembly.CreateInstance(mTypeName);
        }