Aller au contenu

nécessité du .close d'une base oracle


edu.mac
 Share

Messages recommandés

Bonjour

 

Je me suis servi de l'exemple dans le programme Xojo pour créer un petit module de lecture d'une base de donnée ORACLE et affichage dans un objet de type DataList.

 

J'ai voulu l'adapter pour faire afficher certains contenus de champs dans un objet de type TextArea mais dans cas et uniquement sur windows, le programme plante sur une erreur : "Recordset was closed"

 

J'en déduis que c'est le .close qui provoque cet erreur aussi je me demande si c'est réellement nécessaire ?

 

Dim sql As String
sql = "SELECT * FROM ESSAI where NUM='5' "
Dim data As RecordSet
data = mDB.SQLSelect(sql)
if data <> Nil Then
while not data.eof
info.Text=data.IdxField(1).StringValue
data.Close <------------ ? ???
wend
data.close
end if

Modifié par edu.mac
Lien vers le commentaire
Partager sur d’autres sites

Ou alors c'est peut-être parce que tu n'as pas ouvert la base :)

 

Pour du SqlLite en local, j'ouvre la base à l'OPEN du programme et je la ferme au CLOSE du programme.

Pour Oracle, je ne sais pas.

 

Remarque, j'avais mal lu ton programme, il y a effectivement un DATA.CLOSE de trop dans la boucle. Un suffit...

Modifié par BorakLeRouge
Lien vers le commentaire
Partager sur d’autres sites

De ce que je me souvient avec Oracle (11g), en Java avec JDBC, c'est que chaque ResultSet devait être fermé avant de pouvoir exécuter une nouvelle requête.

Si ma mémoire est bonne c'est parce que le pilote JDBC n'a qu'un seul ResultSet, et donc s'il veux le mettre a jours il faut qu'il soit libre (donc fermé par l'utilisateur).

 

Enfin bon, c'était avec Java et JDBC, je sais pas si c'est la même chose avec Xojo.

 

Mais de toute façon ton problème n'est pas lié a ça car tu ne fais de nouvelle requête.

Comme dit le hamster il y a beaucoup trop de close : tu ferme ton ResultSet alors que tu as pas fini de le parcourir.

 

J'ai une autre question, dans ta boucle je vois pas a quel moment tu passe à l'élément suivant.

Ton problème viendrais pas plutôt de là, non? Car je suppose que sans le close dans la boucle le programme ne s'arrête jamais (puis que tu n'arrive jamais a avoir eof égal a True).

Lien vers le commentaire
Partager sur d’autres sites

je me suis bien trompé en recopiant le code :zz-big-mouche:

Dim sql As String
sql = "SELECT * FROM ESSAI where NUM='5' "

Dim data As RecordSet
data = mDB.SQLSelect(sql)

if data <> Nil Then
while not data.eof
info.Text=data.IdxField(1).StringValue
data.moveNext
wend

data.close <-- ?

end if

 

J'ai multiplié les exemples : idem. Je vais renoncer à développer pour windows, ça plante en permanence, c'est épouvantable :(

Modifié par edu.mac
Lien vers le commentaire
Partager sur d’autres sites

J'allais te le dire. Ton close ne peux se faire que si la tu as réussi à ouvrir la base donc dans le bloc If/EndIf, mais après toutes tes lectures, donc après la boucle While/WEnd.

Et c'est valable pour toutes les BD.

Modifié par Hurrican
Lien vers le commentaire
Partager sur d’autres sites

J'ai refais un essai : plantage

 

Dim sql As String
Dim data As RecordSet

sql = "SELECT * FROM ESSAI where NUM='5' "
data = mDB.SQLSelect(sql)
if data <> Nil Then
while not data.eof
info.Text=data.IdxField(1).StringValue
data.moveNext
wend
end if
data.close

 

et dans l'exemple de doc de Xojo

 

 If data <> Nil Then
While Not data.EOF
DataList.AddRow(data.IdxField(1).StringValue, data.IdxField(2).StringValue, _
data.IdxField(3).StringValue, data.IdxField(4).StringValue)

data.MoveNext
Wend
data.Close
End If

Modifié par edu.mac
Lien vers le commentaire
Partager sur d’autres sites

l'exemple que j'avais poste en 1er lieu, n'est pas bien différent de celui de Xojo, or ça plante.

 

Dim sql As String
sql = "SELECT * FROM ESSAI where NUM='5' "

Dim data As RecordSet
data = mDB.SQLSelect(sql)

if data <> Nil Then
while not data.eof
info.Text=data.IdxField(1).StringValue
data.moveNext
wend
data.close <-- ?
end if

 

celui de Xojo

If data <> Nil Then
While Not data.EOF
DataList.AddRow(data.IdxField(1).StringValue, data.IdxField(2).StringValue, _
data.IdxField(3).StringValue, data.IdxField(4).StringValue)

data.MoveNext
Wend
data.Close
End If

Modifié par edu.mac
Lien vers le commentaire
Partager sur d’autres sites

Le programme plante (windows) systématiquement au moment du remplissage (info.Text=data.IdxField(1).StringValue) dans le TextArea. J'ai un code en hexadecimal sans aucune autre précision. Dans un "DataList" ça marche sans problème.

Lien vers le commentaire
Partager sur d’autres sites

Tu as pu vérifier par débogage (en hexadécimal tant qu'à faire), la valeur de data.IdxField(1).StringValue ?

Si çà se trouve il y a un caractère qui n'a rien à faire là, genre code de contrôle, un nul de terminaison...

J'avoue ne pas utiliser de base Oracle, donc je ne sais pas ce que vaut ce plugin. Je connais en revanche les défauts (toujours pas corrigés depuis des années de signalement) du plugin MySQL, et particulièrement sa non prise en compte de l'encodage de la base, ce qui oblige à tout convertir de Latin1 en UTF8 lors des lectures et dans l'autre sens en écriture, mais au moins on arrive à faire ce que qu'on veut.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

Petites remarques sur ton code:

Apres data = mDB.SQLSelect(sql)

tu devrais avoir:

 

if mDB.Error then

dim er as string = mDB.ErrorMessage

return

end if

Ce serait plus propre et prudent

 

D'autre part ton data.close plante peut être quand il est nil (quand la requete a retourné une erreur

 

Enfin je ne vois pas l interet de placer le contenu du champ de la BdD dans un champ text en l'écrasant a chaque tour

 

bye

Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Share

×
×
  • Créer...