Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Zeos свойства запроса / 16 сообщений из 16, страница 1 из 1
27.09.2018, 14:11
    #39709291
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
Пишу демку на делфи + Zeos,одна из задач - если запрос селективный - вывести данные в грид,если нет - выполнить и вывести подтверждение.

проблема в том,что если я пытаюсь сделать query.open на запросе insert/update/delete получаю "Can not open a Resultset". Как можно проверить запрос перед выполнением, чтобы вызывать нужный метод?
...
Рейтинг: 0 / 0
27.09.2018, 14:22
    #39709296
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
Gallemar,

Посмотреть на то, с чего текст запроса начинается. СУБД какая?
...
Рейтинг: 0 / 0
27.09.2018, 14:26
    #39709300
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
Gallemarпроблема в том,что если я пытаюсь сделать query.open на запросе insert/update/delete получаю "Can not open a Resultset".
Кто мешает "выполнить и вывести подтверждение"?

GallemarКак можно проверить запрос перед выполнением, чтобы вызывать нужный метод?
Зависит от. В некоторых DAC-ах были соответствующие фичи. Или можно просто проверить, что первая лексема либо SELECT, либо WITH.
...
Рейтинг: 0 / 0
27.09.2018, 14:28
    #39709303
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
DarkMasterGallemar,

Посмотреть на то, с чего текст запроса начинается. СУБД какая?
Firebird
...
Рейтинг: 0 / 0
27.09.2018, 14:28
    #39709304
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
Gallemar,

Можно примерно так сделать:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
type
  TIB_SQLTextType=(sttSelect,sttExecute,sttExecuteBlock,sttSQL);

function GetSQLTextType(SQLText:string):TIB_SQLTextType;
var S:String;
begin
  S:=Trim(SQLText);  // тут хорошо бы еще переводы каретки в пробелы перевести и удрать задвоенные пробелы
  if UpperCase(Copy(S,1,13))='EXECUTE BLOCK' then
     Result:=sttExecuteBlock
  else
  if UpperCase(Copy(S,1,9))='EXECUTE ' then
     Result:=sttExecute
  else
  if UpperCase(Copy(S,1,7))='SELECT ' then
     Result:=sttSelect
  else
     Result:=sttSQL;    // INSERT,UPDATE,DELETE и т.д.
end;
...
Рейтинг: 0 / 0
27.09.2018, 14:30
    #39709309
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
softwarerGallemarпроблема в том,что если я пытаюсь сделать query.open на запросе insert/update/delete получаю "Can not open a Resultset".
Кто мешает "выполнить и вывести подтверждение"?
А как? Zeos не дает использовать open с неселективными запросами.
softwarerGallemarКак можно проверить запрос перед выполнением, чтобы вызывать нужный метод?
Зависит от. В некоторых DAC-ах были соответствующие фичи.
В Zeos такое не нашел.
...
Рейтинг: 0 / 0
27.09.2018, 14:31
    #39709311
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
GallemarDarkMasterПосмотреть на то, с чего текст запроса начинается. СУБД какая?
Firebird

Угу, тогда еще учитывай что DataSet может из EXECUTE BLOCK приехать, не только из SELECT... А может и не приехать - для EXECUTE BLOCK нужно еще проверять наличие SUSPEND внутри.
...
Рейтинг: 0 / 0
27.09.2018, 14:31
    #39709313
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
GallemarА как? Zeos не дает использовать open с неселективными запросами.
Что значит "не даёт"?
...
Рейтинг: 0 / 0
27.09.2018, 14:34
    #39709317
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
softwarerGallemarА как? Zeos не дает использовать open с неселективными запросами.
Что значит "не даёт"?

Там кажется разбивка по методам : Open() и Exec()
...
Рейтинг: 0 / 0
27.09.2018, 14:35
    #39709318
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
softwarerGallemarА как? Zeos не дает использовать open с неселективными запросами.
Что значит "не даёт"?
я же выше писал - если используешь запрос insert/update/delete c open получаешь "Can not open a Resultset"
...
Рейтинг: 0 / 0
27.09.2018, 14:38
    #39709321
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
Gallemarя же выше писал - если используешь запрос insert/update/delete c open получаешь "Can not open a Resultset"
А я выше спросил: кто мешает, получив это, соответствующим образом отреагировать?
...
Рейтинг: 0 / 0
27.09.2018, 14:45
    #39709328
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
Gallemarя же выше писал - если используешь запрос insert/update/delete c open получаешьА какой ты датасет хочешь получить в ответ? Юзай Exec как учат
...
Рейтинг: 0 / 0
27.09.2018, 14:49
    #39709332
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
softwarerGallemarя же выше писал - если используешь запрос insert/update/delete c open получаешь "Can not open a Resultset"
А я выше спросил: кто мешает, получив это, соответствующим образом отреагировать?
Не видел. Т.е. попытаться выполнить Open, поймать e.message и выполнить exec()?
...
Рейтинг: 0 / 0
27.09.2018, 14:54
    #39709335
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
GallemarНе видел. Т.е. попытаться выполнить Open, поймать e.message и выполнить exec()?
Например. Не буду утверждать, что этот метод безусловно лучший, но по сравнению с другими методами он обладает двумя важными достоинствами: короткий и надёжный.
...
Рейтинг: 0 / 0
27.09.2018, 15:01
    #39709341
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
А что мешало открыть исходники и найти такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TZAbstractRODataset.InternalOpen;
var
  ColumnList: TObjectList;
begin
    ...............
    { Creates an SQL statement and resultsets }
    ResultSet := CreateResultSet(FSQL.Statements[0].SQL, -1);
    if not Assigned(ResultSet) then
    begin
      if not (doSmartOpen in FOptions) then
        raise Exception.Create(SCanNotOpenResultSet)
      else Exit;
    end;
   ................

?

А после этого подумать и написать так
Код: pascal
1.
2.
3.
4.
ZDataSet1.Options := ZDataSet1.Options + [doSmartOpen];
ZDataSet1.Open;
if ZDataSet1.ResultSet = nil then
  SHowMessage('Statement executed');


P.S. Флаг doSmartOpen можно выставить в дизайнтайме
...
Рейтинг: 0 / 0
27.09.2018, 15:41
    #39709366
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Zeos свойства запроса
_Vasilisk_, спасибо!!!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Zeos свойства запроса / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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