使用shinyapps.io时出现“first argument”错误,rodbc在web

时间:2017-06-26 03:04:30

标签: sql hana rodbc shinyapps

首先,我需要使用R从HANA数据库中获取SQL查询结果,我在Rstudio中使用RODBC完成。

其次,我需要与其他人共享我的代码,我使用shinyapps.io来完成。

但是,我需要使用shinyapps在其他计算机上显示我的SQL查询结果,我有以下错误消息:

error first argument is not an open rodbc channel

我使用了R shiny RODBC connection Failing的答案,但它仍无效。

这是我的ui.R和sever.R的代码附件:

ui.R:

library(dplyr)
library(RODBC)
library(stringr)
library(ggplot2)
fluidPage(
  titlePanel("Basic DataTable"),
  fluidRow(
    DT::dataTableOutput("table")
  )
)

sever.R:

library(dplyr)
library(RODBC)
library(stringr)
library(ggplot2)
ch<-odbcConnect('HANARB1P',uid='****',pwd='****')
options(scipen = 200)
myOffice <- 0
StartDate <- 20170601
EndDate <- 20170610
office_clause = ""
if (myOffice != 0) {
  office_clause = paste(
    'AND "_outer"."/BIC/ZSALE_OFF" IN (',paste(myOffice, collapse=", "),')'
  )
}
function(input, output) {
  output$table <- DT::renderDataTable(DT::datatable({
  data <- sqlQuery(channel=ch,query=paste(' SELECT TOP 100
                                                   "/BIC/ZSALE_OFF" AS "SalesOffice",
                                                   "/BIC/ZHASHPAN" AS "CreditCard"
                                            FROM "SAPB1P"."/BIC/AZ_RT_A212"
                                            WHERE "CALDAY" BETWEEN',StartDate,'AND',EndDate,'
                                                  ',office_clause,'
                               '))
    data
  }))

}

有人可以帮帮我吗?如何使用shinyapps.io和RODBC在网页上显示SQL查询结果进行共享?

根据答案,我稍微修改了我的代码。但是,某种情况再次发生了。当我使用代码时:

function(input, output) {
  output$table <- DT::renderDataTable(DT::datatable({
    data <- sqlQuery(channel=ch,query=paste(' SELECT TOP 50
                                                 "/BIC/ZSALE_OFF" AS "SalesOffice",
                                                     "/BIC/ZHASHPAN" AS "CreditCard"
                                              FROM "SAPB1P"."/BIC/AZ_RT_A212"
                                              WHERE "CALDAY" BETWEEN',StartDate,'AND',EndDate,'
                                                    ',office_clause,'
                                            '))
    data
  }))
}

我有错误信息:

enter image description here

当我使用代码时:

shinyServer(
function(input, output) {
  data <- sqlQuery(channel=ch,query=paste(' SELECT TOP 50
                                                 "/BIC/ZSALE_OFF" AS "SalesOffice",
                                                     "/BIC/ZHASHPAN" AS "CreditCard"
                                              FROM "SAPB1P"."/BIC/AZ_RT_A212"
                                              WHERE "CALDAY" BETWEEN',StartDate,'AND',EndDate,'
                                                    ',office_clause,'
                                            '))
  output$table <- DT::renderDataTable(data)
}
)

我有错误信息:

enter image description here

我确信频道有效。如果我只是使用run app来执行此操作:

shiny::runApp('//paper/fchen4/feng.officeworks/mycode/myShiny')

工作正常。但我在一家公司工作,我不知道防火墙或某事可能与这个错误有关。但如果我不在这里使用SQL,那就没关系

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

嗯,你检查过频道是否真的打开了吗? 错误消息可能是凭据错误,无法访问的服务器或任何其他阻止SQL连接成功的结果。

使用以下代码显示表格内容时没有问题:

ui.R

library(shiny)

# Define UI for application that draws a histogram
shinyUI(fluidPage(

  # Application title
  titlePanel("Basic Data Table"),       
     fluidRow(
        dataTableOutput("table")
     )
))

server.R

library(shiny)
library(RODBC)

ch <- odbcConnect("S12")

# Define server logic to provide table output
shinyServer(
    function(input, output) {

        query_result <- sqlQuery(channel = ch, query = 'SELECT * FROM M_DATABASE')
        output$table <- renderDataTable(query_result)
    }
)

没有理由围绕SQL查询的结果调用DT::datatable(),因为它已经返回了一个可以输入renderDataTable()的数据框。

一些一般提示:

  • 从不将您的登录数据放入应用程序代码中。在SCN Blog "HANA quick note – checking my connections and using them securely …"中,我解释了如何安全地存储和使用SAP HANA系统的连接和登录数据。这也为您提供了一种检查与HANA实例的连接的简便方法。 此外,仅指向ODBC DSN连接而不是提供所有参数看起来更清晰。

  • 您不需要ui.R文件中的所有R库,因为使用RODBC等库的代码位于server.R文件中。确保每个文件中都包含最少的库,以使您的生活更轻松。

  • 打破长嵌套函数参数调用并没有什么坏处,就像我使用“calling-SQL-statement-convert-resultset-data-type-feed-it-into-render-function”一样。如果在一行中没有太多命令,那么在失败的情况下,更容易理解发生的事情。

这对你有用。