J'ai utilisé RMySQL pour importer une base de données. Parfois, lorsque j'essaie de fermer la connexion, le message d'erreur suivant s'affiche:
Error in mysqlCloseConnection(conn, ...) :
connection has pending rows (close open results set first)
Je n'ai pas d'autre moyen de corriger cela que de redémarrer l'ordinateur, quoi que je puisse faire pour le résoudre? Merci!
Nous pouvons utiliser la méthode dbClearResult.
Exemple:
dbClearResult(dbListResults(conn)[[1]])
Comme le note Multiplexer, vous faites probablement une erreur en laissant une partie du résultat derrière.
DBI et les packages d'accesseurs tels que RMySQL ont une documentation qui est parfois un peu difficile. J'essaie de me rappeler d'utiliser dbGetQuery()
qui saisit tout le résultat. Voici un extrait du code de 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 effectuer d'autres opérations).
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
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 contenant des lignes en attente, cela peut parfois entraîner le blocage de la machine.
Je ne sais pas grand chose à propos de rmysql, mais essayez d’abord de fermer le jeu de résultats.
Vous devez vous rappeler à propos du résultat vous-même. Dans l'exemple ci-dessous, vous apprendrez à fermer/effacer les résultats et à prendre les lignes affectées. Pour résoudre votre problème, utilisez la dernière ligne de code de la variable, qui prend les résultats de l’une de vos déclarations ou requêtes envoyées. :)
statementRes <- DBI::dbSendStatement(conn = db,
"CREATE TABLE IF NOT EXISTS great_dupa_test (
taxonomy_id INTERGER NOT NULL,
scientific_name TEXT);")
DBI::dbGetRowsAffected(statementRes)
DBI::dbClearResult(statementRes)
Comme expliqué dans les réponses précédentes, vous obtenez cette erreur car RMysql n'a pas renvoyé 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 à récupérer par extraction. Utilisez n = -1 ou n = Inf pour récupérer tous les enregistrements en attente.
Solutions :
1- Réglez le nombre d'enregistrements à l'infini: my_result <- fetch( dbSendQuery(con, query), n=Inf)
2- utilisez dbGetQuery: my_result <- dbGetQuery(con, query)