> использование параметризованного запроса и повторный запуск его с другими параметрами будет быстрее, чем создание новых запросов каждый раз.
На самом деле, это не улучшит производительность в струе, если вы говорите о производительности запросов. Фактически, из документа JET «Обзор производительности и методы оптимизации» мы получаем этот драгоценный камень:
стр. 18
Поскольку хранимые запросы имеют предварительно скомпилированный план запросов, параметризованные запросы, содержащие параметры в индексированных столбцах, могут выполняться неэффективно. Поскольку механизм запросов не знает значений, которые должны быть переданы в параметре заранее, он может только догадываться о наиболее эффективном плане запроса. Исходя из рассмотренных нами сценариев производительности клиентов, мы обнаружили, что в некоторых случаях можно добиться существенного повышения производительности путем замены хранимого параметризованного запроса временным запросом. Это означает создание строки SQL в коде и передачу ее методам DAO OpenRecordset или Execute объекта Database
Аккуратно, а? И я испытал вышеупомянутое!
Имейте в виду, что время компиляции для плана запроса в любом случае составляет тысячи секунд. Я имею в виду, на самом деле, время плана запроса изменяется от 0,01 до 0,0001. Конечно, это в 100 раз быстрее, но это всего лишь экономит нам одну сотую секунды. Мы запускаем отчет, который занимает 2 секунды, поэтому время планирования запроса даже не является проблемой.
Сегодня у нас есть ГОВ обработки. Это узкие места для дисков, памяти и скорости сетевого ввода / вывода. У нас также нет проблемы с использованием кэша SQL-запросов сервера для каждой новой строки SQL-запроса, отправляемой в JET. Эти встроенные планы SQL-запросов в любом случае не кэшируются. И, что еще важнее, JET - это клиентский движок, поэтому, когда у вас есть 10 пользователей в офисе, у вас есть 10 копий JET, работающих локально на каждом компьютере. Кеш плана запросов не является проблемой, как для сервера SQL.
Как показывает приведенный выше технический документ (и мой опыт), преимущества более совершенного плана запросов за счет принудительной перекомпиляции этого sql без параметров перевешивают преимущества наличия предварительно выполненного плана запросов с параметрами.
Однако, чтобы не сбиться с пути, нужно согласиться с Дэвидом. Я не думаю, что когда вы используете odbc или, в данном случае, объектную модель dao + jet, я не могу придумать ЛЮБОГО СПОСОБА ввести реальный SQL-оператор.
Возможно, с приведенным выше примером «lame» InputBox () можно ввести условия, которые могут привести к неожиданным результатам. Как уже указывалось, встроенные приложения доступа не очень часто работают таким образом.
Для таких вещей, как удаление записи, вы просматриваете форму, и она будет иметь пользовательскую строку меню (или теперь ленту), или просто кнопку удаления, размещенную на форме. Таким образом, пользователь не может ввести неверные данные для этого типа кода удаления.
Более важно, когда мы часто принимаем данные от пользователей в формах, имейте в виду, что наши формы имеют встроенные маски данных. В конце концов это довольно много для чего MS Access был разработан. Следовательно, если мы запрашиваем номер телефона, пользователь не может вводить буквы или даже не числовые символы для этой маски ввода. Эта маска будет даже вставлять () и - в соответствующие места в этом телефонном номере для отображения, но только цифры будут вводиться в фактический ввод пользователя.
Для большинства других типов приглашений мы используем поля со списком, списки рассылки и другие элементы пользовательского интерфейса, что опять-таки ограничивает возможность пользователей вводить что-то другое, кроме того, что эта форма позволяет в это текстовое поле.
Из-за такого обильного количества возможностей маскирования и ввода, которые выходят далеко за рамки большинства создателей экрана, инъекции - редкая тема для приложений на основе MS-доступа.
Если кто-то может показать пример JET, в котором пользователь может выполнить SQL-оператор путем инъекции, я весь в ушах, так как не думаю, что это возможно с dao + jet.
Для приложений с MS-доступом это может быть возможно, но, опять же, на практике это очень сложно.