简体   繁体   中英

how to close resultset in RMySQL?

I used RMySQL for import database, sometimes when I try to close the connection, I receive the following error:

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

I have no other ways of correcting this other than restarting the computer, anything I can do so solve this? Thanks!

We can use the method dbClearResult.
Example:

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

As Multiplexer noted, you are probably doing it wrong by leaving parts of the result set behind.

DBI and the accessor packages like RMySQL have documentation that is a little challenging at times. I try to remind myself to use dbGetQuery() which grabs the whole result set at once. Here is a short snippet from the CRANberries code:

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

After this I can close without worries (or do other operations).

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

last line removed the following error when continuing querying

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

You need to close the resultset before closing the connection. If you try to close the connection before closing the resultset which has pending rows then sometimes it lead to hang the machine.

I don't know much about rmysql but try to close the resultset first.

You have to remember about result's set yourself. In example below you have how to close/clear results and how to take the rows affected. To solve your problem use last line of code on variable which takes results from any of yours sent statement or query. :)

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)

As explained in previous answers, you get this error because RMysql didn't return all the results of the query.
I had this problem when the results where over 500 ,using :

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

looking at the documentation for fetch I found that you can specify the number of records retrieved :

n = maximum number of records to retrieve per fetch. Use n = -1 or n = Inf to retrieve all pending records.

Solutions :

1- set the number of record to infinity : my_result <- fetch( dbSendQuery(con, query), n=Inf)

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

When I used this in R. It worked for me!

Just run the command of dbConnect(). I just reconnected the db.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM