Компоненты 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 или команда 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 во время разработки, в частности, запускают компонент TADOCommand, и он "просто ломается". Это особенно раздражает, когда вы пытаетесь написать запрос или команду и знаете, что это работает, но компонент ADO решил не принимать "?" или ":x" прямо сейчас. Вы можете обойти его полную неспособность функционировать, переключаясь с одного на другое. Но меня это расстраивает, а других людей, наверное, вообще блокирует. Я знаю, что некоторые люди всегда динамически создают свой SQL в коде и избегают использования Параметры, и, возможно, поэтому.

Возможные ответы на мой вопрос, которые я ожидаю, следующие:

  1. ADO не поддерживает несколько команд, по крайней мере, оболочки Delphi не поддерживают. Или, может быть, TADOCommandздесь просто работает ненадежно.

  2. Параметры — это область с ошибками во всех ADO или во всех оболочках ADO Delphi?

  3. Вы делаете это неправильно.

Я использую Delphi XE2, но я видел такое же хитроумное поведение в 2007, 2009, 2010 и XE. Я использую поставщика Microsoft OLEDB для SQL Server в качестве поставщика OLEDB.

24
задан Warren P 8 August 2012 в 14:02
поделиться