Bonjour tout le monde !
cela fait un peu plus de 3 jours que j'ai un bug. j'ai une petite théorie mais je voudrais une confirmation de votre part, ou bien un infirmation (avec une solution ca serait génial), ou sinon merci quand même.
en fait je suis entrain de programmer une procédure stockée en c# (elle trop compliquée, pour l'expliquer) mais je donne un exemple d'illustration de mon bug.
j'ai cette proceddure stockée en c#
qui est compilable en .NET 2.0 et deployable dans SQLSERVER 2005 sans aucune erreur
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 [Microsoft.SqlServer.Server.SqlProcedure] public static void toto() { using (SqlConnection MARSconnection = new SqlConnection("context connection=true")) { MARSconnection.Open(); SqlCommand comm = MARSconnection.CreateCommand(); comm.CommandType = CommandType.Text; comm.CommandText = "SELECT TOP 10 [ImageFileName] FROM [media_content].[dbo].[resultHistoColor0G1Z6]"; using (SqlDataReader reader = comm.ExecuteReader()) { while (reader.Read()) { } } comm = MARSconnection.CreateCommand(); comm.CommandType = CommandType.Text; comm.CommandText = "SELECT TOP 10 [ImageFileName] FROM [media_content].[dbo].[resultHistoColor0G1Z6]"; using (SqlDataReader reader1 = comm.ExecuteReader()) { while (reader1.Read()) { } SqlCommand comm1 = MARSconnection.CreateCommand(); comm1.CommandType = CommandType.Text; comm1.CommandText = "CREATE TABLE [dbo].[tete]( [im_RecordID] [varchar](17) NULL)"; comm1.ExecuteNonQuery(); } MARSconnection.Close(); } }
Le code ci dessus produit l'erreur suivante
les paramètres de connexion connectionString (définit au niveau des propriétés du projet contenant cette procédure stockée) sont valides (equivalent à celles du programme ci dessous). je souligne qu'il y a l'option MultipleActiveResultSets=True.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Une erreur .NET Framework s'est produite au cours de l'exécution de la routine ou de la fonction d'agrégation définie par l'utilisateur 'toto'*: System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first. System.InvalidOperationException: at System.Data.SqlClient.SqlInternalConnectionSmi.ValidateConnectionForExecute(SqlCommand command) at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Kmeans_SP.toto()
Or cette procedure stockée je l'ai implenté sous forme d'un programme "application console" en c#. elle fonctionne parfaitement. le programme est le suivant:
je signale que les paramètres de connexion du programme doivent contenir l'option MultipleActiveResultSets=True pour être en mesure de s'exécuter (MARS).
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 using System; using System.Data.SqlClient; using System.Data; namespace testTypes { class Program { static void Main(string[] args) { String ConnectionString = "MultipleActiveResultSets=True;" + "Data Source=THESE\\SQLSERVER;Initial Catalog=media_content" + ";Persist Security Info=False;Integrated Security=SSPI;"; using (SqlConnection MARSconnection = new SqlConnection(ConnectionString)) { MARSconnection.Open(); SqlCommand comm = MARSconnection.CreateCommand(); comm.CommandType = CommandType.Text; comm.CommandText = "SELECT TOP 10 [ImageFileName] FROM [media_content].[dbo].[resultHistoColor0G1Z6]"; using (SqlDataReader reader = comm.ExecuteReader()) { while (reader.Read()) { } } comm = MARSconnection.CreateCommand(); comm.CommandType = CommandType.Text; comm.CommandText = "SELECT TOP 10 [ImageFileName] FROM [media_content].[dbo].[resultHistoColor0G1Z6]"; using (SqlDataReader reader1 = comm.ExecuteReader()) { while (reader1.Read()) { } SqlCommand comm1 = MARSconnection.CreateCommand(); comm1.CommandType = CommandType.Text; comm1.CommandText = "CREATE TABLE [dbo].[tete]( [im_RecordID] [varchar](17) NULL)"; comm1.ExecuteNonQuery(); } MARSconnection.Close(); } Console.WriteLine("good"); Console.ReadKey(); } } }
les paramètres de connexion sont exactement les mêmes.
donc ce qui m'induis à conclure que l'option MultipleActiveResultSets=True ne fonctionne que si le programme ne s'exécute pas au niveau du serveur mais à l'exterieure.
qu'est ce que vous en pensez ?
Partager