Я бы избегал этого, используя on.exit
:
get.total.orders <- function(db.connex.string, start.date, end.date){
db.connex <- odbcDriverConnect(db.connex.string)
on.exit(odbcClose(db.connex)) # <----------------------- change here
ord.qry <- sprintf("SELECT ord_OrderReference AS 'order.ref',
ord_RegisterDate as 'register.date'
FROM Orders
WHERE ord_RegisterDate >= '%s' AND ord_RegisterDate < '%s'",
start.date, end.date)
orders <- sqlQuery(db.connex, ord.qry)
return(orders)
}
Таким образом, соединение будет закрыто даже в случае ошибки. См. также ?on.exit
.
[РЕДАКТИРОВАТЬ]
Вышеприведенное предполагает, что дескриптор не был закрыт из-за ошибки при выполнении запроса. Если запрос был в порядке, но дескриптор просто не был закрыт, то я понятия не имею. odbcClose
возвращает 0 в случае успеха, так что вы можете это проверить.
[EDIT2]
Как указывали другие, об этом, вероятно, не о чем беспокоиться - с другой стороны, все равно было бы интересно выяснить, почему соединение не закрывается, если вы явно указываете его закрыть. Может быть, это всего лишь вопрос миллисекунд, и запрос еще не завершен, когда результат присваивается. Для меня это не имеет особого смысла, так как если результат присваивается orders
, то что еще может быть в базе данных? Но, может быть, что-то есть. В этом случае можно попытаться дать ему еще немного времени, например.
#...
orders <- sqlQuery(db.connex, ord.qry)
orders # or force(orders) - to just evaluate the result once more
Sys.sleep(0.01) # give it 10 milliseconds
orders # or return(orders) - to return the result
# presuming on.exit as before - so odbcClose will happen here too
}
Это звучит очень глупо, но я не удивлюсь, если это действительно сработает.
Другая идея заключается в том, что если вы используете Rstudio, вы можете получить некоторые фантомные сообщения об ошибках, как это происходит, например, при использовании plot
с несуществующим графическим параметром в первый раз, а затем без ошибок во второй раз.
plot(1, bimbo=2) # here you get some warnings as bimbo is not a graphical parameter
plot(2) # nothing wrong here but RStudio replays the previous warnings
Возможно, что-то подобное происходит с обработчиками db — если это так, было бы поучительно посмотреть, получаете ли вы одинаковые предупреждения как в RStudio, так и в консоли (Rgui или Rterm в Windows или запуск R в терминале в Linux). Это, конечно, применимо, если вы используете Rstudio.
И, наконец, вы можете попробовать опубликовать это на r-help, поскольку Брайан Рипли (один из авторов RODBC) присутствует там, но не здесь.
Так что, как видите, у меня нет реального ответа, и если для его выяснения требуется слишком много усилий, я бы рекомендовал не беспокоиться об этом :)
person
lebatsnok
schedule
06.02.2014
odbcClose
удалось? - person James   schedule 10.02.2014print
вокруг него. Он возвращает значение незаметно:TRUE
в случае успеха иFALSE
в случае неудачи. - person James   schedule 10.02.2014if(odbcClose(db.connex)!=TRUE) warning("ODBC channel not closed")
посмотреть, не смогу ли я поймать это, когда это произойдет. - person mac   schedule 10.02.2014