Bonjour,

Je dois faire un site qui utilise une base de données existante, hébergée en HFSQL.

Le site est en ASP.NET (C#).

J'ai trouvé sur le site de WinDev un connecteur OLEDB, que j'arrive à utiliser depuis ASP.NET.

Voici un exemple de code :
Code C# : 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
 
    public static List<Call> GetAll(CallStatus? status)
    {
        Resp resp = HttpContext.Current.Session["resp"] as Resp;
 
        List<Call> calls = new List<Call>();
 
        Logger.Instance.LogMessage("Call", Logger.ErrorLevel.Verbose, "Chargement de tous les appels");
 
        using (OleDbConnection cnx = new OleDbConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyHFSQL"].ConnectionString))
        {
            cnx.Open();
 
            using (OleDbCommand cmd = cnx.CreateCommand())
            {
                cmd.CommandText = "select APPEL_Id, APPEL_Date, APPEL_Heure, APPEL_Duree, APPEL_TiersCode, APPEL_ContactId, APPEL_ContactNom, APPEL_ContactTel, APPEL_Createur, APPEL_Resume, APPEL_NoContrat, APPEL_Statut from FIC_APPELS where APPEL_Createur = ?";
                cmd.Parameters.AddWithValue("@resp", resp.ID);
                if (status != null)
                {
                    cmd.CommandText += " and APPEL_Statut = ?";
                    cmd.Parameters.AddWithValue("@status", (int)status);
                }
                cmd.CommandType = CommandType.Text;
                OleDbDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    calls.Add(new Call() { ID = dr.GetInt32(0), Date = dr.GetDateTime(1), Time = dr.GetTimeSpan(2), Duration = (decimal)dr.GetInt32(3) / 3600, CustomerCode = dr.GetString(4), ContactCode = dr.GetInt32(5), ContactName = dr.GetString(6), Phone = dr.GetString(7), RespCode = dr.GetString(8), Summary = Rtf.RtfToText(dr.GetString(9)), ContractCode = dr.GetString(10), Status = (CallStatus)dr.GetInt32(11) });
                }
                dr.Close();
 
                cmd.Dispose();
            }
 
            cnx.Close();
            cnx.Dispose();
        }
 
        return calls;
    }

Vous noterez l'utilisation de using() {} et les Dispose() explicites en plus des Close().

Ce code fonctionnement parfaitement bien : je charge bien la liste des appels désirés. Tout est pour le mieux dans le meilleur des mondes possible.

Au détail près que :
- après plusieurs minutes, en décorrélation totale avec l'activité sur le site, j'obtiens des erreurs w3wp.exe planté
- si la liste d'appels est trop longue, IIS plante (plantage violent de chez violent : la plupart du temps l'AppPool ne veut plus redémarrer tant que j'ai pas complètement redémarré le service

D'après les quelques informations que j'ai réussi à tirer du message d'erreur et du debugger, le pilote HFSQL tente de lire des zones de mémoires qui ont été libérées.
=> On dirait que lorsque le Garbage Collector de .NET tente de libérer les ressources, le pilote perd la boule et tente de libérer des ressources déjà libérées (ou un truc du genre).

Quelqu'un a-t-il déjà travaillé dans un scénario similaire ?
Avez-vous déjà rencontré ce telles erreurs ?
Comment y avez-vous rémédié ?