Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TADOQuery.Parameters.Refresh; Не найден параметр, MS SQL 2005, ADO  
V
    Опции темы
Avers
Дата 15.9.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.6.2008
Где: 26rus

Репутация: нет
Всего: нет



Работаю с MS SQL 2005. Компоненты ADO
В приложении должно произойти следующее (код скажет больше, чем я словами): 
Код

const
  CSQLString = 'DDELETE FROM Table1 WHERE (LOWER([Name]) = LOWER(:@Name))'

  with ADOQuery do
    begin
      if Active then
        Close;
      SQL.Clear;
      SQL.Add(CSQLString);
      Parameters.Refresh;
      Parameters.ParamByName('@Name').Value := ANameParam;
      ExecSQL;
    end;

Но на деле не создается, и как следствие не находится, параметр @Name.
Подскажите в чем может быть проблема. Собственных мыслей нет :( ибо подобный код использую уже далеко не впервые. 
В других случаях (чаще это 'EXEC [dbo].[sp_StoredProcedure] :@ParamName' - все работает. 

--------------------
Born to be wild
PM MAIL   Вверх
pseud
Дата 15.9.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Код

  with ADOQuery do
    begin
      if Active then
        Close;
      SQL.Clear;
      SQL.Add(CSQLString);
      Parameters.Clear;
      Parameters.ParseSQL(SQL.Text, True);
      Parameters.ParamByName('@Name').Value := ANameParam;
      ExecSQL;
    end;



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Avers
Дата 15.9.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.6.2008
Где: 26rus

Репутация: нет
Всего: нет



Спасибо, помогло. ParseSQL до этого пробовал, но... неверно это делал 
--------------------
Born to be wild
PM MAIL   Вверх
pseud
Дата 15.9.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Код

Parameters.Clear;

можно убрать, т.к. ParseSQL с установленным Create = True сам делает Clear

Добавлено через 1 минуту и 8 секунд
Avers, и возможно есть другой метод, я то ADO не пользуюсь.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Avers
Дата 15.9.2010, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.6.2008
Где: 26rus

Репутация: нет
Всего: нет



Вопрос, конечно решен. Но обнаружилась интересная вещь.
Постарался привести все использование ADO в проекте к однообразию. Т.е.
Код

      Parameters.ParseSQL(SQL.Text, True);
      Parameters.ParamByName('@Name').Value := ANameParam;

Обнаружилось: что в некоторых случаях такой подход несрабатывает, и нужно добавить Refresh:
Код

      Parameters.ParseSQL(SQL.Text, True);
      Parameters.Refresh;
      Parameters.ParamByName('@Name').Value := ANameParam;

А в других наоборот, с Refresh не работает и его дописывать ни как нельзя. Типы параметров в обоих случаях строковые. Разница лишь в длине SQL 71 (работает без Refresh) и 51 (работает только с Refresh).
Если кто сталкивался, помогите решить проблему. Как программно определить какой метод использовать для корректного определения параметров?
--------------------
Born to be wild
PM MAIL   Вверх
pseud
Дата 16.9.2010, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Avers @  15.9.2010,  22:00 Найти цитируемый пост)
Обнаружилось: что в некоторых случаях такой подход несрабатывает, и нужно добавить Refresh:

у меня нет TADOConnection.
я бросаю на форму компонент TADOQuery.
задаю ему SQL и пытаюсь сделать Parameters.Refresh;.
получаю:
Цитата

---------------------------
Project1
---------------------------
Missing Connection or ConnectionString.
---------------------------
ОК   
---------------------------

т.е. для отрабатывания Refresh нужен открытый коннекшен. А это глупость, ведь я всего лишь хочу, чтобы автосоздались параметры согласно заданному SQL

Добавлено через 9 минут и 10 секунд
в функции
Код

function TParameters.ParseSQL(SQL: string; DoCreate: Boolean): string;

нет никаких ограничений на размер SQL. Возможно он не может "съесть" какие-то названия параметров.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Frees
Дата 16.9.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(pseud @  16.9.2010,  12:35 Найти цитируемый пост)
А это глупость,

парсит запрос драйвер поэтому конект и нужен


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
pseud
Дата 16.9.2010, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Frees @  16.9.2010,  09:44 Найти цитируемый пост)
парсит запрос драйвер поэтому конект и нужен 

Понял. Возможно это и не плохо. 
Получается необходимо ожидать/обрабатывать обрыв соединения каждый раз в двух местах. 
1. При подговотоке параметров.
2. При выполнении запроса.
Ну это так - тонкости.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0874 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.