40 votes

comment fermer un jeu de résultats dans RMySQL ?

J'ai utilisé RMySQL comme base de données d'importation, parfois lorsque j'essaie de fermer la connexion, je reçois l'erreur suivante :

Error in mysqlCloseConnection(conn, ...) : 
  connection has pending rows (close open results set first)

Je n'ai aucun autre moyen de corriger ce problème que de redémarrer l'ordinateur. Que puis-je faire pour résoudre ce problème ? Merci !

49voto

Steve Qian Points 116

Nous pouvons utiliser la méthode dbClearResult.
Exemple :

dbClearResult(dbListResults(conn)[[1]])

16voto

Dirk Eddelbuettel Points 134700

Comme l'a noté Multiplexer, vous vous y prenez probablement mal en laissant des parties de l'ensemble des résultats derrière vous.

DBI et les paquets d'accès comme RMySQL ont une documentation qui est parfois un peu difficile. J'essaie de me rappeler d'utiliser dbGetQuery() qui saisit l'ensemble des résultats en une seule fois. Voici un court extrait du code CRANberries :

sql <- paste("select count(*) from packages ",
             "where package='", curPkg, "' ",
             "and version='", curVer, "';", sep="")
nb <- dbGetQuery(dbcon, sql)

Après cela, je peux fermer sans soucis (ou faire d'autres opérations).

3voto

stda Points 36
rs<- dbGetQuery(dbcon, sql)
data<-dbFetch(rs)
dbClearResult(rs)

la dernière ligne a supprimé l'erreur suivante lors de la poursuite de l'interrogation

Error in .local(conn, statement, ...) : 
  connection with pending rows, close resultSet before continuing

3voto

Mnl Points 11

Comme expliqué dans les réponses précédentes, vous obtenez cette erreur parce que RMysql n'a pas retourné tous les résultats de la requête.
J'ai eu ce problème lorsque les résultats étaient supérieurs à 500 ,en utilisant :

my_result <- fetch( dbSendQuery(con, query))

En regardant la documentation de fetch, j'ai trouvé que vous pouvez spécifier le nombre d'enregistrements récupérés :

n = nombre maximum d'enregistrements à extraire par recherche. Utilisez n = -1 ou n = Inf pour récupérer tous les enregistrements en attente.

Solutions :

1- fixer le nombre d'enregistrement à l'infini : my_result <- fetch( dbSendQuery(con, query), n=Inf)

2- utiliser dbGetQuery : my_result <- dbGetQuery(con, query)

1voto

User 1034 Points 2480

Vous devez fermer le jeu de résultats avant de fermer la connexion. Si vous essayez de fermer la connexion avant de fermer le jeu de résultats qui a des lignes en attente, cela peut parfois entraîner un blocage de la machine.

Je ne connais pas bien rmysql mais essayez d'abord de fermer le jeu de résultats.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X