Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Узнать возвращает ли TADOCommand пустой _Recordset


Автор: Beltar 1.10.2009, 12:09
Хочу сделать простейший редактор запросов, TMemo с текстом, TreeView со структурой базы и кнопочка Execute.

Запрос может быть произвольным, как возвращающим данные, так и не возвращающим, TADOQuery.ExecSQL набора не возвращает, а TADOQuery.Open не дружит с разными Update. TADOCommand всегда возвращает _Recordset, но к его свойствам я обратиться не могу, хотя отладчик и показывает, что у пустого _Recordset'а RecordCount=-1.
Что делать? Вариант с парсингом запроса и проверкой, что он начинается с Select мне как-то не очень нравится.

Автор: Romikgy 1.10.2009, 20:02
правильнее всего имхо заюзать 
Цитата(Beltar @  1.10.2009,  11:09 Найти цитируемый пост)
TADOQuery.Open

а при пустом ответе 
Цитата(Beltar @  1.10.2009,  11:09 Найти цитируемый пост)
RecordCount

должно равнятся нулю
Цитата(Beltar @  1.10.2009,  11:09 Найти цитируемый пост)
а TADOQuery.Open не дружит с разными Update.

это в каких случаях?

Автор: Beltar 1.10.2009, 20:46
Ну, например,
Update МояСуперПуперТаблица
Set ОдноПоле=Чего-то
Where Что-то=чему-то

Этот запрос прекрасно отработает, если я буду юзать не Open, который пригоден только для запросов возвращающих данные, а ExecSQL, который данные не возвращает но, повторяю, я не знаю какой именно запрос будет выполняться.

RecordCount=0 не означает пустого запроса, в нем есть хотя бы структура таблицы.

Изначально я тоже думал, что сделаю Open и буду счастлив, при первом же апдейте получил ошибку, типа набор данных закрыт.

Автор: Romikgy 1.10.2009, 23:08
делай тогда типа 
.Active := true;
Цитата(Beltar @  1.10.2009,  19:46 Найти цитируемый пост)
RecordCount=0 не означает пустого запроса, в нем есть хотя бы структура таблицы.

т.е. есть возможность вообще не правильного запроса?
тогда ошибка вылетит ,
в чем собстно вопрос то ?

Автор: Beltar 2.10.2009, 07:27
Был вот такой код:

Код

Q.Active:=false;
Q.SQL.Clear;
for i:=0 to MM.Lines.Count-1 do
  Q.SQL.Add(MM.Lines[i]);
try
Q.Active:=true;
finally
end;
if fmTestReport.QueryGrid.DataSource<>QSource then
  fmTestReport.QueryGrid.DataSource:=QSource;
fmTestReport.Show;


Этот код прекрасно работает, если запрос имеет вид Select * From МояТаблица, запрос с апдейтом же вызывает Exception с сообщением "Q: Command Text does not return a result set".

Замена Q.Active=true на Q.ExecSQL ошибок не вызывает, но и набор данных даже при примитивном селекте получается пустой.

Есть идея использовать TADOCommand т. к. он возвращает набор данных, который можно подсунуть какому-нибудь наследнику TADODataSet.

Код

S:='';
for i:=0 to MM.Lines.Count-1 do
  S:=S+' '+MM.Lines[i];
Cmd.CommandText:=S;
RecordSet:=Cmd.Execute(Affected,EmptyParam);
if RecordSet.RecordCount<0 then
  begin
  ShowMessage(IntToStr(Affected)+' записей затронуто');
  end
                            else
  begin
  Q.Recordset:=RecordSet;
  if fmTestReport.QueryGrid.DataSource<>QSource then
    fmTestReport.QueryGrid.DataSource:=QSource;
  fmTestReport.Show;
  end;


Это работает, если набор не пустой получается, если набор пустой, то при попытке обращения к его свойствам вываливается ошибка: "Операция не допускается, если объект закрыт". Т. е. нужно как-то проверить Recordset на пустоту.

Автор: Vas 2.10.2009, 07:46
Я парсил первое слово первой строки, если select то open, иначе Execute.
А собсно вопрос, а если пользователь процедуру набьет в твоем Мемо, как выполнять ее думаешь?

Автор: Beltar 2.10.2009, 09:22
Пока тоже написал парсер, точнее по лености взял его из DRKB, помню парсер строки в TStrings был вроде где-то готовый, но в хелпе ничего не нашел.
Ну а потом вот так:
Код

SplitTextIntoWords(S,Words);
Select:=False;
for i:=0 to Words.Count-1 do
  begin
  Select:=ANSICompareText(Words[i],'Select')=0;
  if Select then Break;
  if ( (ANSICompareText(Words[i],'Update')=0) or
    (ANSICompareText(Words[i],'Insert')=0) or
    (ANSICompareText(Words[i],'Delete')=0) ) then  Break;
  end;


Насчет хранимок. В принципе у меня софтина работает только с одной базой и хранимка там сейчас всего одна, возвращает некоторые права залогиневшегося юзера. Зачем мне возиться с хранимками, если проще генерировать запросы на клиенте. Система в общем-то достаточно простая чтобы особо не заморачиваться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)