Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать возвращает ли TADOCommand пустой _Recordset 
:(
    Опции темы
Beltar
Дата 1.10.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

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



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

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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Romikgy
Дата 1.10.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



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

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

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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Beltar
Дата 1.10.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

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



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

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

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

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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Romikgy
Дата 1.10.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Beltar
Дата 2.10.2009, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

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



Был вот такой код:

Код

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 на пустоту.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Vas
Дата 2.10.2009, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

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



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


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Beltar
Дата 2.10.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

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



Пока тоже написал парсер, точнее по лености взял его из 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;


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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
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.1192 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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