Bonjour,

J'ai développé un site web en ASP.net - C# qui travaille avec une base de données. Le site fonctionne très bien, sauf lorsqu'il ya deux utilisateurs en même temps ... C'est un problème :-) !!

J'ai une classe qui me permet de créer ma connexion à la base:

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 
 
    /// <summary>
    /// Classe permettant l'accès à la base de données 
    /// </summary>
    /// <remarks>Cette classe se base dur DBFactory. 
    /// Par conséquent, la connexion peut s'effectuer sur différents type de base de données.</remarks>
    public class DBAccess
    {
        #region Variables privées
 
        /// <summary>
        /// Connexion à la base de données
        /// </summary>
        private DbConnection dbConnection = null;
 
        /// <summary>
        /// Chaine de connexion à la base de données 
        /// </summary>
        private ConnectionStringSettings connectionStringSettings;
 
        /// <summary>
        /// Instance de connexion liée à la base de données
        /// </summary>
        private static DBAccess gtmInstance;
 
        /// <summary>
        /// Verrou sur l'instance de connexion
        /// </summary>
        private static object gtmInstanceLocker = new object();
 
        #endregion
 
        #region Propriétés
 
        /// <summary>
        /// Chaine de connexion vers la base de données 
        /// </summary>
        public ConnectionStringSettings ConnectionStringSettings
        {
            get { return connectionStringSettings; }
            set { connectionStringSettings = value; }
        }
 
        /// <summary>
        /// Propriété permettant de récupérer l'instance de connexion à la base de 
        /// données
        /// <remarks>Utilise le singleton pattern</remarks>
        /// </summary>
        public static DBAccess Instance
        {
            get
            {
                lock (gtmInstanceLocker)
                {
                    if (gtmInstance == null)
                        gtmInstance = new DBAccess();
 
                    return gtmInstance;
                }
            }
        }
 
        #endregion
 
        #region Méthodes publiques
 
        /// <summary>
        /// Méthode permettant la récupération de la connexion à la base de données ouverte
        /// </summary>
        /// <returns>La connexion à la base de données</returns>
        public DbConnection getDataBaseConnection()
        {
            DbProviderFactory factory = null;   // -- DataBase provider
 
            try
            {
                // -- Récupération du type de base de données en fonction
                // -- de la chaine de connexion
                // ------------------------------------------------------
                factory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
 
                // -- Création de la connexion
                // ---------------------------
                if (dbConnection == null)
                    dbConnection = factory.CreateConnection();
 
                // -- Renseignement de la chaine de connexion
                // ------------------------------------------
                if (dbConnection.State == ConnectionState.Closed)
                    dbConnection.ConnectionString = ConnectionStringSettings.ConnectionString;
 
                // -- Ouverture de la connexion si cette dernière est fermée
                // ---------------------------------------------------------
                if (dbConnection.State == ConnectionState.Closed)
                    dbConnection.Open();
            }
            catch (Exception ex)
            {
                throw new Exception("GTMAccess.getDataBaseConnection : " + ex.Message + "\n");
            }
 
            return dbConnection;
        }
Ensuite j'ai développé mes classes qui permettent l'accès aux données (DAL) dans lesquelles je fais des choses de ce genre la:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
try
{
using (DbConnection dbConnection = DBAccess.Instance.getDataBaseConnection())
      {
          return getAllThemes(includeSubFolders, dbConnection);
      }
}
catch (Exception ex)
{
    throw new Exception(ex.Message + "\n");
}
Le hic c'est que lorsque deux utilisateurs se connecte et effectuent des opérations sur le site... J'ai des message d'erreurs du style
Un dataReader est déja ouvert.
Est ce que vous comprenez ce qui se passe ???
Merci.