Как обновить текстовое поле в R, подключенном к базе данных Access через ODBC?

Я связал 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 = ""))

person SIE_Vict0ria    schedule 23.11.2020    source источник
comment
Бегло взглянув, можно предположить, что dquote неправильно цитирует вашу колонку. Вместо этого следует использовать встроенные функции кавычек из DBI dbQuoteIdentifier (столбцы, имена таблиц), dbQuoteLiteral (значения, не являющиеся строками) и dbQuoteString (для строк). Я бы предложил написать ваш запрос вручную, протестировать его, а затем автоматизировать. Однако будьте осторожны! Если ваша программа имеет пользовательский ввод, чрезвычайно легко внедрить код Access SQL. Всегда заканчивайте выражение, используя ; (поскольку Access не принимает несколько операторов) и всегда указывайте свои значения.   -  person Oliver    schedule 23.11.2020
comment
На это был дан ответ: stackoverflow.com/questions/64971555/   -  person SIE_Vict0ria    schedule 24.11.2020
comment
Возможно, вы захотите рассмотреть параметризованные запросы вместо создания строк запроса вручную. Хотя существуют опасения по поводу безопасности вредоносных инъекций SQL (например, Подвиги мамы, также известные как Little Bobby Tables), это также проблема искаженных строк или Unicode-vs- Ошибки ANSI, даже если запрос выполняет один аналитик данных. И DBIodbc), и RODBC поддерживают параметризованные запросы либо изначально, либо через надстройки.   -  person r2evans    schedule 25.11.2020
comment
Кроме того, я бы использовал dbExecute вместо dbSendStatement. (Я не вижу признаков того, что вы очищаете результат от своего кода, который немного небрежен. dbExecute делает это за вас.)   -  person r2evans    schedule 25.11.2020