Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Message d'erreur de LINQ to SQL

4 réponses
Avatar
Gilbert Tordeur
Bonjour,

Lorsque je tente d'exécuter une instruction Linq pour lire une ligne d'une
table SQL, j'obtiens le message d'erreur suivant à l'exécution de
l'instruction "If LaRegle.Count < 1" :
InvalidOperationException : Un DataReader associé à cette commande est déjà
ouvert. Il doit d'abord être fermé.

Je ne comprends pas ce que ce message signifie. Voici mon code ci-dessous.
Quelqu'un a-t-il une idée ?

Merci d'avance,
Gilbert.

Private Function DeterminerRegleCautionBancaire(ByVal mntCautionBancaire As
Decimal _
, ByVal durCautionBancaire As Integer) As Boolean
DeterminerRegleCautionBancaire = False
Dim ContexteRegle As New
DoaReglesCautionBancaireDataContext(ObjSessionDivers.OpenFinance)
Dim LaRegle = From Regle In ContexteRegle.DoaReglesCautionBancaire _
Where ( _
(Regle.RebMntCautionBancaire >= mntCautionBancaire) _
And (regle.RebDurCautionBancaire >= durCautionBancaire) _
) _
Order By Regle.RebMntCautionBancaire Ascending _
, Regle.RebDurCautionBancaire Ascending _
Take 1

If LaRegle.Count < 1 Then
Alert.Show(String.Format(Msg018, "de la caution bancaire"))
Exit Function
End If

NumRegleCautionBancaire = LaRegle.First.RebNumRegle
LaRegle = Nothing
ContexteRegle = Nothing
DeterminerRegleCautionBancaire = True
End Function

4 réponses

Avatar
Patrice
Bonjour,

A priori on tente plusieurs lectures en même temps sur une même connexion.

Dès la première exécution ? Qu'est ce que cela donne avec un
ContexteRegle.Dispose (bien placé pour qu'il soit toujours exécuté) ?

Cela n'a rien à voir mais les noms me paraissent un peu étranges (le nom du
contexte est le même que le nom de la table exposée par ce contexte ?)

--
Patrice

"Gilbert Tordeur" a écrit dans le message de
groupe de discussion :
Bonjour,

Lorsque je tente d'exécuter une instruction Linq pour lire une ligne d'une
table SQL, j'obtiens le message d'erreur suivant à l'exécution de
l'instruction "If LaRegle.Count < 1" :
InvalidOperationException : Un DataReader associé à cette commande est
déjà ouvert. Il doit d'abord être fermé.

Je ne comprends pas ce que ce message signifie. Voici mon code ci-dessous.
Quelqu'un a-t-il une idée ?

Merci d'avance,
Gilbert.

Private Function DeterminerRegleCautionBancaire(ByVal mntCautionBancaire
As Decimal _
, ByVal durCautionBancaire As Integer) As Boolean
DeterminerRegleCautionBancaire = False
Dim ContexteRegle As New
DoaReglesCautionBancaireDataContext(ObjSessionDivers.OpenFinance)
Dim LaRegle = From Regle In ContexteRegle.DoaReglesCautionBancaire _
Where ( _
(Regle.RebMntCautionBancaire >= mntCautionBancaire) _
And (regle.RebDurCautionBancaire >= durCautionBancaire) _
) _
Order By Regle.RebMntCautionBancaire Ascending _
, Regle.RebDurCautionBancaire Ascending _
Take 1

If LaRegle.Count < 1 Then
Alert.Show(String.Format(Msg018, "de la caution bancaire"))
Exit Function
End If

NumRegleCautionBancaire = LaRegle.First.RebNumRegle
LaRegle = Nothing
ContexteRegle = Nothing
DeterminerRegleCautionBancaire = True
End Function



Avatar
Gilbert Tordeur
Merci Patrice,
En fait, un DataReader était bien ouvert sur la même connexion. J'ai été
induit en erreur par "associé à cette commande".
En ce qui concerne les noms : le nom du contexte comporte le mot Contexte,
le nom de la table ne le contient pas. Ils sont donc différents. Qu'est-ce
qui te chiffonne ?
Gilbert

"Patrice" <http://www.chez.com/scribe/> a écrit dans le message de news:

Bonjour,

A priori on tente plusieurs lectures en même temps sur une même connexion.

Dès la première exécution ? Qu'est ce que cela donne avec un
ContexteRegle.Dispose (bien placé pour qu'il soit toujours exécuté) ?

Cela n'a rien à voir mais les noms me paraissent un peu étranges (le nom
du contexte est le même que le nom de la table exposée par ce contexte ?)

--
Patrice

"Gilbert Tordeur" a écrit dans le message de
groupe de discussion :
Bonjour,

Lorsque je tente d'exécuter une instruction Linq pour lire une ligne
d'une table SQL, j'obtiens le message d'erreur suivant à l'exécution de
l'instruction "If LaRegle.Count < 1" :
InvalidOperationException : Un DataReader associé à cette commande est
déjà ouvert. Il doit d'abord être fermé.

Je ne comprends pas ce que ce message signifie. Voici mon code
ci-dessous. Quelqu'un a-t-il une idée ?

Merci d'avance,
Gilbert.

Private Function DeterminerRegleCautionBancaire(ByVal mntCautionBancaire
As Decimal _
, ByVal durCautionBancaire As Integer) As Boolean
DeterminerRegleCautionBancaire = False
Dim ContexteRegle As New
DoaReglesCautionBancaireDataContext(ObjSessionDivers.OpenFinance)
Dim LaRegle = From Regle In ContexteRegle.DoaReglesCautionBancaire _
Where ( _
(Regle.RebMntCautionBancaire >= mntCautionBancaire) _
And (regle.RebDurCautionBancaire >= durCautionBancaire) _
) _
Order By Regle.RebMntCautionBancaire Ascending _
, Regle.RebDurCautionBancaire Ascending _
Take 1

If LaRegle.Count < 1 Then
Alert.Show(String.Format(Msg018, "de la caution bancaire"))
Exit Function
End If

NumRegleCautionBancaire = LaRegle.First.RebNumRegle
LaRegle = Nothing
ContexteRegle = Nothing
DeterminerRegleCautionBancaire = True
End Function






Avatar
Patrice
> En ce qui concerne les noms : le nom du contexte comporte le mot Contexte,
le nom de la table ne le contient pas. Ils sont donc différents. Qu'est-ce
qui te chiffonne ?
Gilbert



Si tu utilises les noms par défaut cela voudrait dire que le nom de la table
présente dans ta base est le même que le nom de ta base. Ce n'est pas
spécialement interdit mais plutôt inhabituel d'autant plus que le nom de
contexte semble assez spécifique (je me serais attendu à qq chose de plus
général style GestionFinancièreDataContext).

Pour expliciter ma pensée je me demandais, si tu ne créais pas un contexte
par Table plutôt qu'un contexte par Base.

--
Patrice
Avatar
Gilbert Tordeur
Patrice,

Oui je crée un contexte par Table plutôt qu'un contexte par Base. En fait ça
fait 3-4 jours que je touche à Linq et je suis donc super débutant en ce
domaine. Tu veux dire qu'il est préférable de créer un seul contexte par
base, auquel se réfèreront toutes mes requêtes Linq ?

Tu connais un bon tutoriel ?

Gilbert

"Patrice" <http://www.chez.com/scribe/> a écrit dans le message de news:

En ce qui concerne les noms : le nom du contexte comporte le mot
Contexte, le nom de la table ne le contient pas. Ils sont donc
différents. Qu'est-ce qui te chiffonne ?
Gilbert



Si tu utilises les noms par défaut cela voudrait dire que le nom de la
table présente dans ta base est le même que le nom de ta base. Ce n'est
pas spécialement interdit mais plutôt inhabituel d'autant plus que le nom
de contexte semble assez spécifique (je me serais attendu à qq chose de
plus général style GestionFinancièreDataContext).

Pour expliciter ma pensée je me demandais, si tu ne créais pas un contexte
par Table plutôt qu'un contexte par Base.

--
Patrice