Я связал R с базой данных Access, используя пакеты ODBC и DBI. Я обыскал Интернет и не смог найти способ написать запрос на обновление, поэтому я использую функцию dbSendStatement для индивидуального обновления записей. В сочетании с циклом for это эффективно работает как запрос на обновление с одной загвоздкой: когда я пытаюсь обновить любое поле в базе данных, которое является текстом, я получаю сообщение об ошибке [Microsoft][ODBC Microsoft Access Driver] One of ваши параметры недействительны.
DBI::dbSendStatement(conn = dB.Connection, statement = paste("UPDATE DC_FIMs_BLDG_Lvl SET kWh_Rate_Type = ",dquote(BLDG.LVL.Details[i,5])," WHERE FIM_ID = ",BLDG.LVL.Details[i,1]," AND BUILDING_ID = ",BLDG.LVL.Details[i,2],";", sep = ""))
Если проще, то при вставке код выглядит так:
DBI::dbSendStatement(conn = dB.Connection, statement = paste("UPDATE DC_FIMs_BLDG_Lvl SET kWh_Rate_Type = “Incremental” WHERE FIM_ID = 26242807 AND BUILDING_ID = 515;", sep = ""))
dquote
неправильно цитирует вашу колонку. Вместо этого следует использовать встроенные функции кавычек изDBI
dbQuoteIdentifier
(столбцы, имена таблиц),dbQuoteLiteral
(значения, не являющиеся строками) иdbQuoteString
(для строк). Я бы предложил написать ваш запрос вручную, протестировать его, а затем автоматизировать. Однако будьте осторожны! Если ваша программа имеет пользовательский ввод, чрезвычайно легко внедрить код Access SQL. Всегда заканчивайте выражение, используя ; (поскольку Access не принимает несколько операторов) и всегда указывайте свои значения. - person Oliver   schedule 23.11.2020DBI
(сodbc
), иRODBC
поддерживают параметризованные запросы либо изначально, либо через надстройки. - person r2evans   schedule 25.11.2020dbExecute
вместоdbSendStatement
. (Я не вижу признаков того, что вы очищаете результат от своего кода, который немного небрежен.dbExecute
делает это за вас.) - person r2evans   schedule 25.11.2020