Всплывающее окно Входной параметр является строго графическим интерфейсом MSAccess.exe.При запуске MS Access в качестве серверной базы данных (вне программного обеспечения MS Office) через ODBC запрос с неизвестным параметром завершится неудачно и возникнет ошибка сценария, вызывающего вызов ODBC.
Следовательно, вам нужно будет создать аналогичное всплывающее окно с графическим интерфейсом в R для этого, используя библиотеки, такие как GWidgets или Shiny , а затем передать значение ввода пользователяв запрос.И сделайте это с фактической параметризацией с использованием RODBCext (расширение RODBC) в случае, если злонамеренный пользователь запускает инъекцию SQL и потенциально стирает данные или уничтожает базу данных SQL Server.
Ниже приведен пример использования GWidgets2 с полем со списком для финансовых лет (снимок экрана ниже).
Библиотеки
library(RDOBC)
library(RODBCext)
library(gWidgets2)
library(gWidgets2tcltk)
options(guiToolkit="tcltk")
GUIФункция (заранее создать gif-образ R и SQLServer)
mainWindow <- function(){
# TOP OF WINDOW
win <- gWidgets2::gwindow("Fiscal Year User Input", height = 200, width = 300)
tbl <- glayout(cont=win, spacing = 8, expand=TRUE)
# IMAGE
tbl[1,1] <- gimage(filename = "RSQLServerGUI.gif",
dirname = "/path/to/gif/image", container = tbl)
# LABEL
tbl[2,1] <- glabel("Fiscal Year Selection: ", container = tbl)
font(tbl[2,1]) <- list(size=12, family="Arial")
# COMBO BOX OF FISCAL YEARS
tbl[3,1, expand=TRUE] <- fiscal_year_cbo <- gcombobox(as.character(c(2012:2018)),
selected = 1, editable = TRUE,
index=TRUE, container = tbl)
font(tbl[3,1]) <- list(size=16, family="Arial")
# COMBO BOX CHANGE FUNCTION (2012 - 2018)
addHandlerChanged(fiscal_year_cbo, handler=function(...) {
fiscal_year_value <- svalue(fiscal_year_cbo) # GET USER SELECTED VALUE
gmessage(paste("You selected FY:", fiscal_year_value))
degrees <- getDegreesData(fiscal_year_value) # GET DATABASE DATA
dispose(win) # CLOSE WINDOW
})
}
Функция запроса (вызывается в обработчике изменения поля со списком выше)
getDegreesData <- function(fy_param) {
dbhandle <- odbcDriverConnect('driver={SQL Server};server=SQLSERVER;database=MYDATABASE;trusted_connection=true')
# PREPARED STATEMENT (NO CONCATENATED DATA)
strSQL <- "select Inst, ID, DegreeDate, Degree
from DEGREE
where FY = ?
group by Inst, ID, DegreeDate, Degree
order by Inst, ID, DegreeDate, Degree"
# PASS PARAMETER TO RETURN DATAFRAME
sql_df <- sqlExecute(dbhandle, strSQL, fy_param, fetch=TRUE)
odbcClose(dbHandle)
return(sql_df)
}
Запуск графического интерфейса пользователя
m <- mainWindow()
Снимок экрана