[英]DBI::dbSendQuery with parameterized query does not work for SQL Server
我的 SQL 服務器中有一個數據庫表dbo.address
。 我想在這個表中插入一行。 我使用dbSendQuery
將插入查詢發送到數據庫。
我想要的是使用參數化查詢,如下例所示。 我不想使用paste
來構造查詢字符串,因為它會變得非常混亂,尤其是在有很多列的情況下。
我下面的代碼不起作用。 ?
適用於 mySQL,但不適用於 SQL 服務器。
有誰知道如何將參數傳遞給查詢字符串? 非常感謝!
順便說一句,我知道我的數據庫連接很好。 在那里通過簡單的查詢工作正常。
library(DBI)
library(odbc)
conn <- DBI::dbConnect(odbc::odbc(),
Driver = "ODBC Driver 13 for SQL Server",
Server = serverName,
Database = dbName,
UID = username,
PWD = pasword,
port=1433)
query = "insert into dbo.address (AddressID, City, PostalCode) values (?,?,?)"
dbSendQuery(conn, query, param=list(1, 'seatle', '98876'))
dbDisconnect(conn)
試試這個(不運行):
# Install and initialise packages:
necessary_packages <- c("DBI", "odbc")
new_packages <- necessary_packages[!(necessary_packages %in% installed.packages()[,"Package"])]
if(seq_along(new_packages) > 0){install.packages(new_packages, dependencies = TRUE)}
lapply(necessary_packages, require, character.only = TRUE)
# Create vectors thats values are to be used in query:
AddressID_vec <- 1
City_vec <- 'seatle'
PostalCode_vec <- '98876'
# Connect to DB:
conn <- DBI::dbConnect(odbc::odbc(),
Driver = "ODBC Driver 13 for SQL Server",
Server = serverName,
Database = dbName,
UID = username,
PWD = pasword,
port = 1433)
# Concatenate base query and vecs:
query <- paste0("insert into dbo.address (AddressID, City, PostalCode) values (",
AddressID_vec,
", ",
City_vec,
", ",
PostalCode_vec,
")"
# Send Query:
dbSendQuery(conn, query)
# Close Connection:
dbDisconnect(conn)
來自DBI::dbSendQuery
文檔
此方法僅適用於 SELECT 查詢
雖然您的問題是關於管理 Microsoft SQL 服務器與 DBI 的連接,但我認為問題在於您用於參數化 INSERT 語句的 DBI 函數的選擇。 如果是這樣,盡管下面的示例基於 SQLite 數據庫,但它可能很有用。
library(DBI)
library(RSQLite)
# Create in-memory SQLite db
conn <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
# Create the `address` table to insert into
res <- DBI::dbSendQuery(conn,
"CREATE TABLE address (
`AddressID` INTEGER PRIMARY_KEY,
`City` TEXT,
`PostalCode` TEXT
)")
DBI::dbClearResult(res)
statement = "INSERT INTO address (AddressID, City, PostalCode) VALUES (?,?,?)"
# We can pass parameters directly to dbSendStatement
res <- DBI::dbSendStatement(
conn,
statement,
params = list(1, 'Seattle', '98876')
)
DBI::dbClearResult(res)
DBI::dbReadTable(conn, "address")
#> AddressID City PostalCode
#> 1 1 Seattle 98876
# We can pass multiple sets of values using dbBind()
res <- DBI::dbSendStatement(conn, statement)
DBI::dbBind(res, list(2, "fooville", "12345"))
DBI::dbBind(res, list(3, "barborough", "54321"))
DBI::dbClearResult(res)
DBI::dbReadTable(conn, "address")
#> AddressID City PostalCode
#> 1 1 Seattle 98876
#> 2 2 fooville 12345
#> 3 3 barborough 54321
DBI::dbDisconnect(conn)
由代表 package (v1.0.0) 於 2021 年 3 月 15 日創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.