Работают ли компоненты ADO, особенно TADOCommand, более надежно с безымянными или именованными параметрами в некоторых случаях?
Есть несколько вопросов о StackOverflow, которые, по-видимому, имеют ответы, противоречащие друг другу на тему ADO/OleDB, delphi TADOQuery/TADOCommand и тему параметров.
Параметры могут быть введены двумя способами: в CommandText или в свойство SQL компонента ADO. Именованные параметры, которые работают для меня большую часть времени, вводятся с двоеточиями:
select a, b, c from bar where bat = :baz
Это работает, 99% времени для меня, просто отлично. Время от времени я натыкаюсь на этот АДО или Дельфи. обертки вокруг него, не принимает ": баз" и требует, чтобы я написал это вместо:
select f, g, h from bar where bat = ?
Это приводит к неназванному параметру вместо именованного параметра. Когда запрос 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 в коде, и избегают использовать Parameters, и, возможно, Именно поэтому.Возможные ответы на мой вопрос, который я предвижу:
АДО не поддерживает несколько команд, или, по крайней мере, фантики Делфи нет. Или, может быть,
TADOCommandпросто не надежно работать здесь.
Параметры багги районе в все разговоров, или все фантики ADO в Делфи?
Ты делаешь это неправильно.
Я использую Delphi XE2, но я видел аналогичное сомнительное поведение в 2007, 2009, 2010 и XE.
Я использую Microsoft OLEDB Provider для SQL Server в качестве Мой поставщик OLEDB.
3 ответов:
Именованные параметры с
:? Я всегда использовал его с@, даже в Visual Studio (ADO.NET). А в T-SQL параметры и переменная имеют префикс@.Не помню, чтобы у вас были проблемы с этим... Вы уверены, что не выбираете нативного клиента (устанавливается с помощью установки клиента SQL server) вместо поставщика OLEDB для SQL Server (который поставляется с окнами)?
К сожалению, я уже давно не использую Delphi, поэтому у меня нет средств проверить этот ответ с точки зрения Delphi.
Это первый раз, когда я вижу именованные параметры с префиксом двоеточия (
Одним из существенных преимуществ именованных параметров является их возможность повторного использования, т. е.:). Обычно в ADODB именованные параметры имеют префикс at (@), а неназванные параметры-вопросительный знак (?).INSERT INTO TABLE T VALUES (@id, @id, 'Hello World');В отношении уровень. После того, как вы использовали параметры, как именованные, так и безымянные, вы можете использовать
CommandText.Parameters.Refreshв качестве быстрого средства создания параметров.
Да, есть некоторые случаи, когда параметры с
?терпят неудачу. Я обнаружил, что иногда мне нужно использовать параметры:named. Именованные параметры имеют преимущество при работе со значениями параметров БД, так как наличие набора свойств Name облегчает отладку запроса ADO, набора данных или таблицы.Я не понимаю, почему. Если у вас есть эта проблема, сначала проверьте, что вы используете правильный поставщик OLEDB, и проверьте, какая версия. Также проверьте потенциальные ошибки синтаксического анализа, вызванные плохим SQL, сгенерированный вами.
Я подозреваю, что внутреннее поведение внутри поставщика OLEDB в коде, для которого у меня нет исходного кода, виновато в этой причуде. Delphi ADO class wrappers-это трансляторы из архитектуры уровня компонентов базы данных Delphi в основные API запросов/таблиц/наборов данных ADO, все из которых находятся под оболочками hood вокруг набора COM-объектов, которые имеют дело с наборами записей ADO.
Comments