Параметризовать запрос RecordSource, чтобы обеспечить возможность обновления данных? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть подчиненная форма в главной форме, которая настроена на просмотр таблицы данных и извлекает данные из базы данных SQL Server на основе предоставленных параметров форм.

Это означает, что при выборе другой группы в поле со спискомили date из средства выбора даты, помещает соответствующую информацию в таблицу данных.

Пользователь должен иметь возможность манипулировать логическим полем в данных, и на данный момент я нашел единственный способ сделать эти данные единственным способом, который я нашел. загрузить и сохранить его обновляемым - это написать запрос в свойстве .RecordSource в VBA полностью, как показано ниже:

Set mf = mainFrm
S = " SELECT t.Date, t.Team, s.Username, t.Reference, t.Status, t.Reason, t.Completed " & _
    " FROM [ODBC;DRIVER=SQL Server;SERVER=<SERVERNAME>;Integrated_Security=SSPI;DATABASE=<DBNAME>].testTbl as t " & _
    " INNER JOIN [ODBC;DRIVER=SQL Server;SERVER=SRVFOSABESQL01;Integrated_Security=SSPI;DATABASE=MO_Productivity].staffTbl as s ON t.emp_id = s.emp_id " & _
    " WHERE t.Team = '" & tmName & "' AND t.Date = #" & wkEnd & "# " & _
    " ORDER BY t.Reference; "
mf.subFrm.Form.RecordSource = S

Очевидно, что огромной проблемой здесь является то, что предоставленные переменные открыты для внедрения SQL, не являютсябудет экранирован и, очевидно, разоблачит строку подключения. Все это можно обойти, но, безусловно, не чувствуется «лучшая практика».

Я пытался использовать свойство .Recordset для получения данных с сервера с помощью сквозного параметризованного запроса / хранимой процедуры. , но, похоже, это односторонняя операция только для чтения, позволяющая помещать данные и делать их «несвязанными» или не обновляемыми.

Какой правильный и более безопасный способ получения этих данных из SQL Serverтак что его можно поместить в RecordSource, чтобы сделать его обновляемым?

1 Ответ

1 голос
/ 25 октября 2019

Я нашел это на fmsinc.com:

Существует множество причин, по которым Query или Recordset могут не обновляться. Некоторые из них довольно очевидны:

  • Запрос представляет собой запрос Totals (использует GROUP BY) или запрос кросс-таблицы (использует TRANSFORM), поэтому записи не являются отдельными записями
  • Полевычисляемое поле, поэтому его нельзя редактировать
  • У вас нет прав / прав для редактирования таблицы или базы данных
  • В запросе используются функции VBA или пользовательские функции, а база данных отсутствует. Не разрешено (доверено) разрешить запуск кода

Некоторые причины менее очевидны, но их нельзя избежать:

  • Изменяемая таблица является связанной таблицей безпервичный ключ. Для определенных серверных баз данных (например, Microsoft SQL Server) Access / Jet требует, чтобы таблица вносила ключи для внесения любых изменений. Это имеет смысл, так как Access хочет выдать SQL-запрос на изменения, но не может однозначно идентифицировать запись.

Менее очевидны следующие ситуации:

  • Элемент списка
  • Запросы с некоторыми полями сводки, связанными с отдельными записями, и отдельные записи по-прежнему нельзя редактировать
  • Запросы с объединениями в несколько таблиц, которые не находятся в ключевых полях
  • Объединенные запросы

Если запрос является обновляемым, то набор записей должен быть обновляемым. Я решил эту проблему с помощью объекта ADO.

См. MS Access 2019 - SQL Server 2017 - Невозможно обновить набор записей здесь, при переполнении стека.

...