powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с AdoConnection.Commands?
9 сообщений из 9, страница 1 из 1
Как работать с AdoConnection.Commands?
    #39986832
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то раньше не обращал внимания на это свойство-массив из AdoConnection. Из справки следует, что количество этих Commands можно получить через CommandCount, но как они туда попадают? Никаких методов добавления в AdoConnection не наблюдается, более того, сразу после подключения массив уже содержит один элемент. Заинтересовало меня это свойство в том плане, что можно вообще в проекте обойтись без создания промежуточных объектов AdoQuery, если сделать примерно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 ADOConnection1.Open;
 with ADOConnection1.Commands[0]
 do begin
    CommandText := 'select top 5 * from Mail';
    with Execute
    do while not EOF
       do begin
          with ADOConnection1.Commands[1]
          do begin
             CommandText := 'select UID from Attachment where UID=:UID';
             Parameters.ParamValues['UID'] := Fields['UID'].Value;
             with Execute
             do begin
                Memo1.Lines.Add(Fields['Description'].Value);
                MoveNext;
                end;
             end;
          MoveNext;
          end;
    end;


но этот код споткнется на обращении к ADOConnection1.Commands[1], т.к. этого элемента в массиве нет.
...
Рейтинг: 0 / 0
Как работать с AdoConnection.Commands?
    #39986858
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ> но как они туда попадают?

При создании связи Connection<->Command/Query.

Страдалецъ> Никаких методов добавления в AdoConnection не наблюдается

И не надо. Считай, что это рид-онли свойство.
Тебе собсно, для чего, спортивный интерес?

Страдалецъ> более того, сразу после подключения массив уже содержит один элемент.

Разве? Мне лень проверять, но он должен быть пустой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как работать с AdoConnection.Commands?
    #39986864
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вы правы, действительно пустой, это я сам накосячил, добавив Command и связав его с Connection. Тогда в принципе логика понятна как они туда попадают. Именно этот один элемент меня и сбил с толку. :)
Но в принципе мысль использовать массив команд под временные запросы довольно интересна. Что-то в этом есть.
...
Рейтинг: 0 / 0
Как работать с AdoConnection.Commands?
    #39986873
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ> Но в принципе мысль использовать массив команд под
Страдалецъ> временные запросы довольно интересна. Что-то в этом есть.

Это попытка экономить на спичках.
Оно того не стоит, забей.

Заведи "служебный" ADOCommand
для таких целей и не парься.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как работать с AdoConnection.Commands?
    #39986900
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня в коде, есть довольно много мест, где я создаю локальные Query и затем их уничтожаю, выглядит примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Var Q: TAdoQuery;
begin
 Q := TAdoQuery.Create(nil);
 try
   Q.Connection := DM.AppDB;
   Q.SQL.Text := 'SELECT ...';
   Q.Open;
   // что-то делаем с данными
 finally
  Q.Free;
 end;


Вот я и подумал, что существенно короче будет выглядеть такой вариант:
Код: pascal
1.
2.
3.
4.
5.
with ADOConnection1.Commands[0]
 do begin
     CommandText := 'SELECT ...';
    with Execute
    do // что-то делаем с данными


С другой стороны, что мне мешает сделать такой-же глобальный набор AdoQuery? А зачем его делать, если есть Commands...
Вот я и говорю, что-то в этом есть - надо думать. :)
...
Рейтинг: 0 / 0
Как работать с AdoConnection.Commands?
    #39986901
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, пожалуй не стоит использовать такой вариант, вполне возможна ситуация, когда будут вложенные процедуры обращающиеся к одному глобальному Commands и тогда случится беда.
...
Рейтинг: 0 / 0
Как работать с AdoConnection.Commands?
    #39986950
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ,

зачем много, если можно в DM создать функции
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 
function OpenQuery( const aSQL: string): TDataSet
function OpenQueryFmt( const aSQL: string; Args: array of const) 
procedure ExecQuery
procedure ExecQueryFmt

.............


with DM.OpenQueryFmt('select * from Tabl where F = %d', [1]) do
try
...
finally
  Free;
end
...
Рейтинг: 0 / 0
Как работать с AdoConnection.Commands?
    #39987093
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно конечно и функцию, вот например такую:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function TDM.GetRecordset(SQL: String): _Recordset;
var
  AC: TAdoCommand;
begin
 AC := TAdoCommand.Create(nil);
 AC.Connection := AppDB;
 AC.CommandText := SQL;
 AC.CommandType := cmdText;
 Result := AC.Execute;
 AC.Free;
end;


Но вот вопрос, а не будет ли при этом утечек памяти, ведь возвращаемый _Recordset явно не уничтожается, это же интерфейс и он не имеет метода Free
...
Рейтинг: 0 / 0
Как работать с AdoConnection.Commands?
    #39987101
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ,

интерфейсы уничтожаются автоматиечски при выходие из области видимости, так что не будет... но с ними работать не удобно, поэтому и сделали обертки наследуемые от TDataSet
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с AdoConnection.Commands?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]