簡體   English   中英

帶有參數化查詢的 DBI::dbSendQuery 不適用於 SQL 服務器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM