Domanda

Una domanda su questo codice R:

library(RODBC)

ch <- tryCatch(odbcConnect("RTEST"),
  warning=function(w){print("FAIL! (warning)");return(NA)},
  error=function(e){print(paste("ERROR:",geterrmessage()));return(NA)})

df <- tryCatch(sqlQuery(ch,"SELECT Test from tblTest"),
  warning=function(w){print("FAIL! (warning)");return(NA)},
  error=function(e){print(paste("ERROR:",geterrmessage()));return(NA)})

odbcClose(ch)

Codice funziona bene per gli errori (forzata omettendo le paramaters richiesti nel codice) in entrambi i casi (avvertenze e parte errori sono quasi esattamente lo stesso):. Ottengo un valore NA e un messaggio d'errore

Anche per un errore con sqlquery (dare un DSN valido):. Valore di NA e un messaggio d'errore

Ma non per gli avvisi con sqlquery. Nessuna uscita messaggio, ma df contiene il messaggio (quindi non NA). Perché?

È stato utile?

Soluzione

Ho controllato il codice per sqlQuery ed ho trovato questo:

stat <- odbcQuery(channel, query, rows_at_time)
if (stat == -1L) {
    if (errors) 
        return(odbcGetErrMsg(channel))
    else return(invisible(stat))
}

error è parametro sqlQuery, il TRUE default, quindi ti dà carattere vettoriale senza errore o avviso. Se si cambia in sqlQuery(ch,"SELECT Test from tblTest",FALSE) allora df conterrà il valore -1. Questo è il codice di errore da C-level, ma non l'errore nella R significa quindi tryCatch non poteva gestire la cosa.

suppongo che è necessario verificare se df==-1 dopo tryCatch.

Altri suggerimenti

Ho finito con questo codice. Ora posso gestire l'error_code specifica Mysql:

saveText <- function(query, channel, errors = TRUE) {
  stat <- odbcQuery(channel, query)
  if (stat == -1L) {
    if (errors)
      err <- odbcGetErrMsg(channel)
    else {
      err <- invisible(stat)
    }
    return(err)
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top