Bonjour,
J'ai crée une classe qui me permet d'aller chercher des données en sql, voici la partie qui va nous interesser :
Voici par ex un appel
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 public class DataBase : IDisposable{ private SqlDataReader reader; private SqlCommand _sqlCommand = new SqlCommand(); public string Requete{get;set;} //... public DataBase(string connection_string) { _sqlCommand.Connection = new SqlConnection(connection_string); } #region IDisposable Membres public void Dispose() { ReleaseReader(); this.sql_command.Dispose(); close_connection(); this.connection.Dispose(); } #endregion private void ReleaseReader() { if (this.reader != null) { this.reader.Dispose(); this.reader = null; } } public bool ExecuteReader() { try { OpenConnection(); reader = _sqlCommand.ExecuteReader(); return true; } catch (Exception ex) { this.error = ex; CloseConnection(); return false; } } public void CloseConnection() { if (_sqlCommand.Connection.State == ConnectionState.Open) _sqlCommand.Connection.Close(); } public void OpenConnection() { if (_sqlCommand.Connection.State == ConnectionState.Closed) _sqlCommand.Connection.Open(); } public T GetDataOrDefault<T>(string field) { try { object res = this.GetReaderData(field); if (res == DBNull.Value) return default(T); return (T)res; } catch (InvalidCastException ice) { throw new Exception("Erreur de cast de donnée : '" + field + "' de type " + this.reader[field].GetType() + " en " + typeof(T).ToString()); } } //retourne faux a la dernière ligne ou si les données n'ont pas étés initialisées public bool NextLine() { if (this.reader == null || !this.reader.Read()) { ReleaseReader(); this.sql_command.Dispose(); close_connection(); this.connection.Dispose();return false; } return true; } //... }
A la base la classe n'implémentait pas IDisposable, mais je me suis rendu compte que parfois mes collègues ne fermais pas les connection.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 using (DataBase db = new Database("connection string...")){ db.Requete = "Select nom FROM toto where id = 3"; db.ExecuteReader(); if(db.NextLine()) string nom = db.GetDataOrDefault<string>("nom"); }
Donc parfois dans le code l'instanciation de DataBase est faite sans le "using", mais comme on le vois dans la methode "NextLine", je fait un controle, et si il n'y a plus de donnée alors je fait la meme chose que dans "Dispose".
Et pourtant a cause de l'implémentation de "IDisposable" (je suis sur que c'est à cause de cette dernière c'est la suele modification apportée), j'ai par moment, pendant 30min dans la journée, des timeout sur des requète bidons.
Peut etre que cela viens des appels fait sans le "using" , mais auparavant (quand la classe n'était pas IDisposable), je n'avais pas ces problème la et tout allait bien.
Avez vous une idée?
Partager