Функции RODBC и ошибки / предупреждения - PullRequest
2 голосов
/ 17 августа 2010

Вопрос об этом коде 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)

Код прекрасно работает для ошибок (вынуждаемых пропуском обязательных параметров в коде) в обоих случаях (части предупреждений и ошибок почти одинаковы): я получаю значение NA и сообщение об ошибке.

Также для ошибки с sqlQuery (укажите недействительный DSN): значение NA и сообщение об ошибке.

Но не для предупреждений с помощью sqlQuery. Сообщение не выводится, но df содержит сообщение (поэтому нет NA). Почему?

Ответы [ 2 ]

5 голосов
/ 17 августа 2010

Я проверил код для sqlQuery и нашел это:

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

error является параметром sqlQuery, по умолчанию TRUE, поэтому он дает вам вектор символов без ошибок или предупреждений. Если вы измените его на sqlQuery(ch,"SELECT Test from tblTest",FALSE), тогда df будет содержать значение -1. Это код ошибки из C-уровня, но не ошибка в R, означающая, что tryCatch не смог обработать его.

Полагаю, вам нужно проверить, если df==-1 после tryCatch.

1 голос
/ 20 июня 2017

Я закончил с этим кодом.Теперь я могу обработать конкретный код ошибки 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)
  }
}
...