Я работаю над приложением Shiny для обновления записей, хранящихся в удаленной базе данных SQLServer2008. Я подключаюсь к БД с помощью RODBC и пытаюсь использовать параметризованные запросы через RODBCext для поддержки массовых обновлений информации.
Я могу заставить параметризованные запросы работать с моей Windows 7, RStudio под управлением R 3.2.3, но по некоторым причинам, когда я пытаюсь запустить тот же код с Linux-машины, работающей с той же версией R и подключающейся к тому же версия драйвера, я получаю следующую ошибку:
Error in sqlExecute(Connection, data = dat) :
42000 402 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The data types char and text are incompatible in the equal to operator.
42000 8180 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Statement(s) could not be prepared.
[RODBCext] Error: SQLExecute failed
In addition: Warning messages:
1: In sqlExecute(Connection, data = dat) :
42000 402 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The data types char and text are incompatible in the equal to operator.
2: In sqlExecute(Connection, data = dat) :
42000 8180 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Statement(s) could not be prepared.
Вот простой пример кода, который правильно работает на моем компьютере с Windows, но не на компьютере с Linux (я удалил информацию о строке подключения):
library(RODBCext)
Connection <- odbcDriverConnect(paste('Driver=ODBC Driver 13 for SQL Server',
'Server=<Server IP>', 'Port=<Port>', 'Database=<Database>', 'UID = <UserID>',
'PWD=<Password>', sep = ';'))
dat <- data.frame(Node_ID = "999", NodeGUID = "AF213171-201B-489B-B648-F7D289B735B1")
query <- "UPDATE dbo.Nodes SET Node_ID = ? WHERE NodeGUID = ?"
sqlPrepare(Connection, query)
sqlExecute(Connection, data = dat)
В этом примере кадр данных создается со столбцами в качестве факторов. Сначала я попытался явно преобразовать столбцы в символы, так как это, похоже, сработало для пользователей, у которых проблемы с датами, но это все равно приводит к той же ошибке SQL. Я также пытался преобразовать Node_ID в числовое значение, чтобы оно соответствовало таблице SQL, и получаю ту же ошибку. Столбцы в таблице Nodes в SQL определяются как:
NodeGUID (PK, char(36), not null)
Node_ID (int, null)
Я попытался объединить вызовы sqlPrepare и sqlExecute, предоставив аргумент запроса для sqlExecute, и, насколько я понимаю, это тривиальная разница, и она приводит к той же ошибке.
Я подозреваю, что должна быть разница в драйверах и в том, как они реализуют любые вызовы SQL, которые делает sqlExecute(). Я также подозреваю, что sqlExecute() должен обрабатывать типы данных, поскольку мои результаты не меняются независимо от типов столбцов.
Спасибо за любую помощь, которую вы можете предоставить!