2010-08-17 13 views
1

Une question sur ce code R:fonctions rodbc et erreurs/avertissements

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) 

code fonctionne très bien pour les erreurs (forcé en omettant les paramaters nécessaires dans le code) dans les deux cas (Avertissement- et une partie d'erreur sont presque exactement la même chose): je reçois une valeur NA et un message d'erreur.

Également pour une erreur avec sqlQuery (donner une DSN invalide): Valeur NA et un message d'erreur.

Mais pas pour les avertissements avec sqlQuery. Aucune sortie de message, mais df contient le message (donc pas de NA). Pourquoi?

+0

Quelle est votre question? –

+0

Désolé, j'ai posté la première partie à rapide. Edité maintenant – waanders

+0

Je n'ai pas accès à la base de données depuis quelques jours, donc je ne peux pas répondre aux commentaires [dans votre question précédente] (http://stackoverflow.com/questions/3440373/functions-and-try-in-r). – Marek

Répondre

3

j'ai vérifié code pour sqlQuery et trouvé ceci:

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

error est le paramètre à sqlQuery, en cas de défaut TRUE, il vous donne vecteur de caractère sans erreur ou d'avertissement. Si vous le changez en sqlQuery(ch,"SELECT Test from tblTest",FALSE) alors df contiendra -1 la valeur. C'est un code d'erreur de niveau C, mais pas d'erreur dans R, donc tryCatch ne pouvait pas le gérer. Je suppose que vous devez vérifier df==-1 après tryCatch.

+1

Merci. Donc, si j'ajoute la partie 'errors = FALSE' et supprime la partie de la fonction d'avertissement, je peux détecter les erreurs en vérifiant la valeur NA et les avertissements en vérifiant la valeur -1. Cela fonctionne, mais je préfère voir une approche pour gérer les erreurs et les avertissements, mais je pense que ce n'est pas possible. – waanders

+1

Vous pourriez laisser une partie d'avertissement au cas où vous auriez un "R-warning" réel. La valeur -1 indique que quelque chose s'est mal passé sur la partie C-level de la connexion odbc. – Marek

0

J'ai fini avec ce code. Maintenant, je peux gérer le spécifique Mysql code_erreur:

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