В некоторых случаях компоненты ADO, особенно TADOCommand, более надежно работают с неименованными или именованными параметрами?
Есть несколько вопросов о StackOverflow, которые, похоже, имеют ответы, которые противоречат друг другу в отношении ADO/OleDB, delphi TADOQuery/TADOCommand и объекта параметров.
Параметры могут быть введены двумя способами, в CommandText или SQL-компоненте компонента ADO. Именованные параметры, которые работают большую часть времени для меня, вводятся с двоеточиями:
select a, b, c from bar where bat = :baz
Это работает, в 99% случаев для меня, просто отлично. Время от времени я нахожу, что обертки ADO или Delphi вокруг него не принимают ": baz" и требуют, чтобы я написал это вместо:
select f, g, h from bar where bat = ?
В результате появляется неименованный параметр, а не именованный параметр. Когда команда ADO Query или ADO содержит только один параметр, это не имеет большого значения. Но это не когда ADO действует на меня. Вчера он действовал в одну сторону, а сегодня другой способ с двойной командой в одном объекте TADOCommand, например, с двумя командами в одной строке CommandText:
delete from bar where id = :id1
delete from bat where id = :id2
Мне пришлось изменить его на это:
delete from bar where id = ?
delete from bat where id = ?
Он работал весь день вчера. Сегодня мне пришлось изменить его на первую версию, чтобы заставить ее работать. Симптом состоял в том, что параметры ADO исчезли и не вернутся, и когда я пытаюсь выполнить команду, я получаю ошибку, индексирую за пределами диапазона, когда пытаюсь получить доступ к Parameters[0]
. Ничто не дает мне предупреждения о том, что параметры уходят. Похоже, что несколько подключений к набору данных ADO, во время разработки, jogs компонент TADOCommand
, в частности, и он "просто ломается". Это особенно неприятно, когда вы пытаетесь написать запрос или команду, и вы знаете, что это работает, но компонент ADO решил не принимать "?" или ": x" прямо сейчас. Вы можете обойти свою полную неспособность функционировать, переключаясь с одного на другой. Но это меня разочаровывает и, вероятно, фактически полностью блокирует других людей. Я знаю, что некоторые люди всегда динамически строят свой SQL-код и не используют Parameters
, и, возможно, именно поэтому.
Возможные ответы на мой вопрос, которые я ожидаю, следующие:
-
ADO не поддерживает несколько команд, или, по крайней мере, оболочки Delphi этого не делают. Или, может быть, TADOCommand
просто не работает надежно здесь.
-
Параметры являются ошибкой во всех ADO или всех оболочках Delphi ADO?
-
Вы делаете это неправильно.
Я использую Delphi XE2, но я видел подобное хитрое поведение в 2007, 2009, 2010 и XE.
Я использую Microsoft OLEDB Provider для SQL Server в качестве моего поставщика OLEDB.
Ответы
Ответ 1
Да, есть случаи, когда параметры с ?
терпят неудачу. Иногда мне приходилось использовать параметры :named
. Именованные параметры имеют преимущество для работы с значениями параметров DB, поскольку наличие набора свойств Name также облегчает отладку запроса или набора данных ADO.
Я не понимаю, почему. Если у вас есть эта проблема, сначала проверьте, что вы используете правильный поставщик OLEDB, и проверьте, какая версия. Также проверьте наличие возможных ошибок синтаксического анализа, вызванных плохим SQL, созданным вами.
Я подозреваю, что внутреннее поведение внутри поставщика OLEDB в коде, для которого у меня нет исходного кода, является виной за эту причуду. Оболочки класса Delphi ADO являются переводчиками из архитектуры уровня компонентов базы данных Delphi в базовые API-интерфейсы ADO/таблицы/набора данных, все из которых находятся под обложками капота вокруг набора COM-объектов, которые имеют дело с ADO RecordSets.
Ответ 2
Именованные параметры с :
? Я всегда использовал его с @
, даже в Visual Studio (ADO.NET).
И в параметрах и переменной T-SQL с префиксом @
.
Не помните, что у вас проблемы с этим... Вы уверены, что не выбрали собственный клиент
(устанавливается с установкой клиента SQL Server) вместо поставщика OLEDB для SQL Server (который
поставляется с Windows)?
Ответ 3
К сожалению, я не использовал Delphi через некоторое время, поэтому, и у меня нет средств для проверки этого ответа с точки зрения Delphi.
Это первый раз, когда я видел именованные параметры с префиксом двоеточия (:
). Обычно в ADODB именованные параметры имеют префикс с параметрами at (@
) и, да, без имени задаются знак вопроса (?
).
Одним из значительных преимуществ названных параметров является их способность повторно использоваться, то есть
INSERT INTO TABLE T VALUES (@id, @id, 'Hello World');
На уровне ADODB. Когда вы используете параметры, названные или неназванные, вы можете использовать CommandText.Parameters.Refresh
как быстрое средство для создания параметров.