在此之前,您需要进行一些更改。需要指出的一些关键概念:
- 你没有
output$tbTable
对象。这意味着您的myData
反应式永远不会被调用,因此您永远不会查询数据库。 - 您正在使用
RODBC
数据库连接,然后在中使用DBI
样式参数sqlQuery
。您应该使用DBI
(RSQLServer
也许是,-我从未使用过)或RODBC
(我经常使用)。 dbhandle
第一次调用后,您将关闭。这是预期的行为吗?用户应该只有一次机会访问数据库吗?
一些小注意事项:
- 我建议使用,
RODBCext
以便您可以使用参数化查询。 Table
是SQL中的保留字。我不确定这是否是占位符,但是将表组件包装在方括号中会很有帮助,例如[schema]。[table_name]。[column_name]- 您没有将查询定向到架构。这可能会或可能不会出现问题。由于从未调用过查询,因此您没有机会查看它是否引发了错误。
我对您的代码的建议是:
library(RODBCext) # Also loads RODBClibrary(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)),因此其他人也许可以填补那里的空白。
如果不想每次单击按钮都创建新连接,则可以在反应式外部创建连接,而不必关闭它。但是,这将留下一个挂起的连接,我不喜欢这样做。



