在odbc软件包中为闪亮的应用程序定义连接

问题描述 投票:0回答:1

我正在通过odbc中的Shiny支持从MS SQL数据库中获取数据。我想避免在每个反应函数中重复此con函数,而只需运行一次并使用它。因此,我将其放在服务器功能中,如:

server <- function(input, output, session){
  con <- dbConnect(odbc(),
                   Driver = "MSODBC",
                   Server = "myserver",
                   Database = "mydatabase",
                   UID = "User",
                   PWD = "Pass",
                   encoding = "windows-1252",
                   Port = 1433) 
on.exit(odbc::dbDisconnect(con))


  main <- reactive({

    squery = dbSendQuery(con,"myQuery",stringsAsFactors = FALSE)
    parameterNmaes = dbFetch(squery )

    result= list(parameterNmaes = parameterNmaes)
    return(result)
  })
 } 

但是这不起作用,并且出现以下错误:

Warning: Error in new_result: external pointer is not valid
  82: <Anonymous>     

通过将con函数放入反应函数main中,一切都很好:

server <- function(input, output, session){

  main <- reactive({
  con <- dbConnect(odbc(),
                       Driver = "MSODBC",
                       Server = "myserver",
                       Database = "mydatabase",
                       UID = "User",
                       PWD = "Pass",
                       encoding = "windows-1252",
                       Port = 1433) 
    on.exit(odbc::dbDisconnect(con))


    squery = dbSendQuery(con,"myQuery",stringsAsFactors = FALSE)
    parameterNmaes = dbFetch(squery )

    result= list(parameterNmaes = parameterNmaes)
    return(result)
  })
 }  

即使我尝试导出con函数作为结果,也可以在其他反应式函数中使用它,如:

result= list(parameterNmaes = parameterNmaes, con = con)
sub1 <- reactive({
con <- main()$con
})

但是我遇到了同样的错误!到目前为止,唯一的解决方案是在所有无功函数中重复con函数!防止这种无意义的重复数据库连接的任何明智的想法将不胜感激。

r sql-server shiny odbc
1个回答
0
投票

如果您运行这个小应用程序:

library(shiny)

ui <- fluidPage()

server <- function(input, output, session){
  on.exit(cat("hello"))
}

shinyApp(ui, server)

然后,只要应用启动,您就会在R控制台中看到“ hello”字样。这是因为Shiny已完成执行server功能。因此,只要应用启动,就会在您的应用中执行dbDisconnect

我会尝试

server <- function(input, output, session){
  con <- dbConnect(odbc(),
                   Driver = "MSODBC",
                   Server = "myserver",
                   Database = "mydatabase",
                   UID = "User",
                   PWD = "Pass",
                   encoding = "windows-1252",
                   Port = 1433) 
  onStop(function() odbc::dbDisconnect(con))

  main <- reactive({
    squery = dbSendQuery(con,"myQuery",stringsAsFactors = FALSE)
    parameterNmaes = dbFetch(squery )
    result= list(parameterNmaes = parameterNmaes)
    return(result)
  })
 } 
© www.soinside.com 2019 - 2024. All rights reserved.