Я проводил некоторые тесты с использованием OleDbCommand и его сбора параметров для базы данных Access.Упорядочение параметров, конечно, необходимо, поскольку это ограничение поставщика OLE DB .NET .Но есть проблема, с которой вы можете столкнуться при использовании вопросительных знаков в качестве заполнителей.
Скажем, у вас есть запрос («хранимая процедура») в вашей БД Access, который выглядит следующим образом, очень упрощенно здесь:
parameters
prmFirstNumber Long,
prmSecondNumber Long;
select
fullName
from
tblPersons
where
numberOfCars < prmFirstNumber And
numberOfPets < prmSecondNumber And
numberOfBooks beteween prmFirstNumber And prmSecondNumber
Здесь вы видите, что простое переключение на вопросительные знаки сломало бызапрос.
В качестве решения этой проблемы я обнаружил, что вы можете использовать имена для параметров.Таким образом, вы можете оставить запрос выше как есть.Вы просто должны использовать тот же порядок при запуске запроса.Как и в этом случае, вы сначала добавляете параметр prmFirstNumber, а затем prmSecondNumber, а затем запускаете запрос.
При повторном использовании параметров, то есть при выполнении запроса более одного раза и установке новых значений для параметров каждый раз, одиндолжен вызвать метод prepare объекта команды сразу после определения параметров.Там есть некоторые детали, которые также должны быть выполнены, посмотрите документацию на "prepare".Не вызывая приготовление вызывает странное поведение без сообщений об ошибках, которые могут повредить вашу базу данных или привести к неправильной информации для пользователей.
Я могу также добавить, что когда запросы хранятся в БД Access с указанными параметрами, как в моемВ приведенном выше примере порядок параметров однозначно определяется разделом параметров.
Я также создал подпрограмму «retrieveDeclaredJetParametersInOrder», которая автоматически заполняет объект OleDbCommand этими именованными параметрами в правильном порядке.Поэтому мой код может выглядеть так:
Dim cmd As New OleDbCommand("qryInAccessDB", Conn)
cmd.CommandType = CommandType.StoredProcedure
Conn.Open()
retrieveDeclaredJetParametersInOrder(cmd)
cmd.Parameters("prmOneOfTheParametersPerhapsTheLastOneDeclared").Value = 1
cmd.Parameters("prmAnotherone").Value = 20
cmd.Parameters("prmYetAnotherPerhapsTheFirstOneDeclared").Value = 300
cmd.ExecuteNonQuery()
Conn.Close()
Итак, как вы видите, я могу обрабатывать его так, как если бы параметры были названы, и мне никогда не придется беспокоиться об их упорядочении.
The retrieveDeclaredJetParametersInOrderконечно, добавляет дополнительное время к выполнению, так как это включает дополнительный вызов БД, где он получает SQL-текст, а затем анализирует имена и типы параметров.