我想在Shiny中查询ODBC数据库。我所需要做的就是使用户能够输入某人的ID号,例如,然后打印出表中位于数据库中的整行。到目前为止,我所能提供的只是输入信息,但似乎并不能查询数据库并打印该信息。
这就是我所拥有的:
library(RSQLite) library(RODBC) library(RODBCext) library(sqldf) #connect to database dbhandle = odbcDriverConnect(...) library(shiny) ui <- shinyUI( pageWithSidebar( headerPanel("Hide Side Bar example"), sidebarPanel( textInput("Id", "Enter Account Number below"), submitButton(text="Submit") ), mainPanel( tabsetPanel( tabPanel("Data", tableOutput("tbTable")) ) ) ) ) server <- function(input, output) { myData <- reactive({ #build query query = paste0("SELECT Fullname FROM Table WHERE ID= ", input$Id) #store results res <- sqlQuery(conn = dbhandle, query = query) #close database databaseClose(dbhandle) #return results res }) } shinyApp(ui = ui, server = server)
任何帮助是极大的赞赏!非常感谢你。
在此之前,您需要进行一些更改。需要指出的一些关键概念:
output$tbTable
myData
RODBC
DBI
sqlQuery
RSQLServer
dbhandle
一些小注意事项:
RODBCext
Table
我对您的代码的建议是:
library(RODBCext) # Also loads RODBC library(shiny) ui <- shinyUI( pageWithSidebar( headerPanel("Hide Side Bar example"), sidebarPanel( textInput("Id", "Enter Account Number below"), submitButton(text="Submit") ), mainPanel( tabsetPanel( tabPanel("Data", tableOutput("tbTable")) ) ) ) ) server <- function(input, output, session) { myData <- reactive({ req(input$Id) #connect to database dbhandle = odbcDriverConnect(...) #build query query = "SELECT [Fullname] FROM [schema].[table_name] WHERE [ID] = ?" #store results res <- sqlExecute(channel = dbhandle, query = query, data = list(input$Id), fetch = TRUE, stringsAsFactors = FALSE) #close the connection odbcClose(dbhandle) #return results res }) output$tbTable <- renderTable( myData() ) } shinyApp(ui = ui, server = server)
我似乎还记得有一种方法可以在会话关闭时关闭数据库连接,但是我无法使其按预期的方式工作session$onSessionEnded(odbcClose(dbhandle)),因此其他人也许可以填补那里的空白。
session$onSessionEnded(odbcClose(dbhandle))
如果不想每次单击按钮都创建新连接,则可以在反应式外部创建连接,而不必关闭它。但是,这将留下一个挂起的连接,我不喜欢这样做。