2010-11-03 12 views
30

Ho usato RMySQL per il database di importazione, a volte quando provo a chiudere la connessione, ricevo il seguente errore:come chiudere il set di risultati in RMySQL?

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

Non ho altri modi per correggere questo tranne il riavvio del computer, qualcosa che posso fare in modo risolvi questo? Grazie!

risposta

33

Possiamo utilizzare il metodo dbClearResult.
Esempio:

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

Downvoted a causa dei motivi spiegati nel post di Dirks: Se hai file in sospeso hai probabilmente fatto un 'dbSendQuery (" SELECT ... ")' senza recuperare tutti i risultati, che probabilmente non è quello che vuoi. Usa sempre 'dbGetQuery' con istruzioni SELECT a meno che tu non abbia ragioni specifiche per non farlo. – Backlin

1

È necessario chiudere il set di risultati prima di chiudere la connessione. Se si tenta di chiudere la connessione prima di chiudere il gruppo di risultati che contiene le righe in sospeso, a volte può causare il blocco della macchina.

Non so molto su rmysql ma provo a chiudere prima il set di risultati.

11

Come ha notato Multiplexer, probabilmente stai sbagliando lasciando parti del set di risultati alle spalle.

DBI ei pacchetti di accesso come RMySQL hanno una documentazione un po 'impegnativa a volte. Cerco di ricordare a me stesso di usare dbGetQuery() che cattura l'intero set di risultati in una sola volta. Ecco un breve frammento dal codice Cranberries:

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

Dopo questo posso chiudere senza preoccupazioni (o fare altre operazioni).

+1

A quanto pare ho fatto questo correttamente non dal design, ma per fortuna. Che comando è che non restituisce tutti i risultati ma lascia aperto il set di risultati? –

+0

* Es. * 'DbSendQuery()' seguito da 'fetch()' con un numero fisso di righe. –

+1

Faccio ciò che Dirk fa, ogni giorno, e funziona perfettamente. – Maiasaura

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

ultima riga rimosso il seguente errore durante l'esecuzione di query di continuare

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

Bisogna ricordare a proposito il risultato di te stesso set. Nell'esempio seguente hai come chiudere/cancellare i risultati e come prendere le righe interessate. Per risolvere il tuo problema usa l'ultima riga di codice sulla variabile che prende i risultati da una qualsiasi delle tue affermazioni o query inviate. :)

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) 
Problemi correlati