Подтвердить что ты не робот

В некоторых случаях компоненты 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.

4b9b3361

Ответ 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 как быстрое средство для создания параметров.