Есть несколько вопросов о 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.