Bonjour tout le monde,

J'attaque les webParts, alors j'écris un PersonalizationProvider (ah oui parce qu'il y en a un de fourni mais pour SQL Server 2005, et maintenant on doit utiliser SQL Server 2014).

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
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
	conn.Open();
	if (userName != null)
	{
		using (SqlCommand cmd = new SqlCommand(strSqlUser, conn))
		{
			cmd.Parameters.AddWithValue("@username", userName);
			cmd.Parameters.AddWithValue("path", path);
			cmd.Parameters.AddWithValue("applicationname", ApplicationName);
			SqlDataReader reader = cmd.ExecuteReader();
			if (reader.HasRows)
			{
				reader.Read();
				userBlobDataObject = reader.GetFieldValue<Object>(0);
				if (userBlobDataObject != null) userDataBlob =
						   ObjectToByteArray(userBlobDataObject);
				reader.Close();
			}
			cmd.Dispose();
		}
	}
	conn.Close();    // Tiens donc pour quoi faire ?
	conn.Open();
	using (SqlCommand cmd = new SqlCommand(strSqlShared, conn))
	{
		cmd.Parameters.AddWithValue("path", path);
		cmd.Parameters.AddWithValue("applicationname", ApplicationName);
		SqlDataReader reader = cmd.ExecuteReader();
		if (reader.HasRows)
		{
			reader.Read();
			sharedBlobDataObject = reader.GetFieldValue<Object>(0);
			if (sharedBlobDataObject != null) sharedDataBlob =
					   ObjectToByteArray(sharedBlobDataObject);
			reader.Close();
		}
		cmd.Dispose();
	}
}
Si j'ai posé au milieu la question "pour quoi faire ?", c'est que fermer la connexion pour la rouvrir juste après ne me paraît pas spécialement intuitif.

Si je ne le fais pas, on me dit qu'un reader est déjà ouvert sur le DataCommand, et qu'il faut le fermer avant d'en ouvrir un autre. Un fil d'il y a six ans lu à l'instant m'a appris que c'est la connexion qui maintient ouvert le reader, et non la commande, bien qu'ExecuteReader soit bien une méthode du SqlDataCommand.

Donc, apparemment, j'ai dû faire une erreur de syntaxe, oublier de fermer le reader. Il y a pourtant bien un reader.Close() après chaque utilisation ?

Je pousse même le zèle jusqu'à taper cmd.Dispose(), ce que j'avoue ne parfois pas faire. Et je retrouve encore le reader dans mes pattes la fois d'après.

Plus précisément, tant que l'utilisateur est anonyme ça se passe bien puisqu'on n'exécute pas la première partie.

Si quelqu'un peut me dire ce qui cloche ?