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é?
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)
}
}