【问题标题】:“first argument“ error when using shinyapps.io, rodbc to show sql query result in web使用shinyapps.io,rodbc在web中显示sql查询结果时出现“第一个参数”错误
【发布时间】:2017-06-26 03:04:30
【问题描述】:

首先,我需要使用 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")
  )
)

服务器.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
  }))
}

我有错误信息:

当我使用代码时:

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)
}
)

我有错误信息:

我确信该频道可以正常工作。如果我只是使用 run app 来执行此操作:

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

它工作正常。但我在一家公司工作,我不知道我的防火墙是否与这个错误有关。但是如果我这里不使用 SQL 也可以。

【问题讨论】:

    标签: sql hana rodbc shinyapps


    【解决方案1】:

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

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

    ui.R

    library(shiny)
    
    # Define UI for application that draws a histogram
    shinyUI(fluidPage(
    
      # Application title
      titlePanel("Basic Data Table"),       
         fluidRow(
            dataTableOutput("table")
         )
    ))
    

    服务器.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 文件中。确保每个文件中都包含最少的所需库,以使您的生活更轻松。

    • 分解长嵌套函数参数调用并没有什么坏处,就像我使用您的“调用 SQL 语句转换结果集数据类型馈送它进入渲染函数”所做的那样.当一行中没有太多命令时,更容易了解发生了什么以及发生了什么失败

    这应该适合你。

    【讨论】:

    • 非常感谢 Lars Br. 的回答。但我仍然有一些问题。我将在下一步隐藏我的登录信息。我确信该频道正在工作,因为当我使用 shiny::runApp('//paper/fchen4/feng.officeworks/mycode/myShiny') 时,没问题。你能再看看这里吗?我根据您在我的问题中的回答添加了一些新的反馈
    • 我认为您首先应该确保 SHINY 服务器和 HANA 之间的连接正常。像 HANARB1P 这样的 ODBC DSN 通常取决于操作系统用户。因此,如果 SHINY 服务器部分在不同的机器和/或不同的用户上运行,则也需要为该用户设置此 DSN。
    • 我根据shinyapps.io 的手册使用shinyapps.io。我认为它在不同的机器上运行。但我不明白你的意思是不同的用户?我看到了一些关于 odbcDriverConnect 的信息,例如support.rstudio.com/hc/en-us/articles/…。你认为我应该尝试 odbcDriverConnect 吗?
    • RODBC 库使用来自 ODBC DSN(数据源名称)的连接详细信息。 DSN 是一个配置设置,必须在机器上和应该使用连接的操作系统用户处完成。如果 DSN 未在您运行代码的服务器上设置,则 ODBC 命令或库将不起作用。最好与维护服务器机器的人联系并在那里配置数据库访问。另请注意,要使 ODBC 在任何机器上工作,必须在该机器上安装 HANA 客户端软件。
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多