2010-08-17 63 views
1

約該R代碼的一個問題:RODBC功能和錯誤/警告

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) 

代碼工作正常的錯誤在這兩種情況下(警告 - 和差錯部分幾乎(通過省略在代碼所需PARAMATERS被迫)完全一樣):我得到一個NA值和一個錯誤消息。

另外對於sqlQuery的錯誤(給一個無效的DSN):NA值和錯誤消息。

但不適用於使用sqlQuery的警告。沒有消息輸出,但df包含消息(所以沒有NA)。爲什麼?

+0

你的問題是什麼? – 2010-08-17 10:43:08

+0

對不起,我發佈了第一部分快速。現在編輯 – waanders 2010-08-17 10:49:34

+0

我有幾天沒有訪問數據庫,所以我不能回答評論[在你以前的問題](http://stackoverflow.com/questions/3440373/functions-and-try-in-r)。 – Marek 2010-08-17 11:23:17

回答

3

我檢查代碼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無法處理它。

我想你需要檢查tryCatch後是否df==-1

+1

謝謝。因此,如果我添加'errors = FALSE'部分並刪除警告函數部分,我可以通過檢查一個-1值來檢查NA值和警告來檢測錯誤。它的工作原理,但我寧願看到一種方法來處理錯誤和警告,但我認爲這是不可能的 – waanders 2010-08-17 12:21:27

+1

如果您有實際的「R警告」,您可以留下警告部分。 '-1'值給出了odbc連接的C級別部分出錯的信息。 – Marek 2010-08-17 12:53:59

0

我結束了這段代碼。現在我可以處理具體的Mysql error_code:

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