Более одного запроса одновременно! Как в Delphi?

Joenka
Дата: 09.12.2007 20:57:33
Такой вопрос. На Delphi пишу программку, в окне которой пользователь может ввести SQL запрос. Когда пользователь вводит один запрос, проблем никаких ADOCommand = DataSet => DataSourse= > DBGrid выводит результат запроса. Проблем в следующем: Пользователь ведь может написать и 2 и более запросов в одно окно, но моя программка все равно возвращает результат первого запроса. Т.е. написал пользователь:

select getdate() - программка возвращает ему текущую дату.
Но как только пользователь пишет:

select getdate()
select 'vasja' Программка все равно только текущую дату возвращает.

Но если написать тоже самое через Query Analyzer то все отлично - 2 DBGrid-a отображают и дату 'vasja'.

Как можно реализовать такую штуку на Delphi?
Альт
Дата: 09.12.2007 21:03:05
в данном случае мы говорим не о многопоточности... потому вам самое время открыть документацию по sql... и узнать, что такое объединения (union) и их вариации и приведение колонок к одному типу
про два грида... и кол-во рекордсетов в одной выборке... видимо... в раздел фантастики
Joenka
Дата: 09.12.2007 21:11:16
Альт
в данном случае мы говорим не о многопоточности... потому вам самое время открыть документацию по sql... и узнать, что такое объединения (union) и их вариации и приведение колонок к одному типу
про два грида... и кол-во рекордсетов в одной выборке... видимо... в раздел фантастики


При чем тут union? Пользователю union даром не нужен! И почему из области фантастики? Вы когда нить Query Analazer открывали? Там в окне пишешь хоть 10 запросов, после нажатия F5 вам снизу создаётся 10 же DbGrid-ов с различными колонками. В приложенном файле четко показано: 2 запроса и два DBGrid-а. Причем в Profiler это проходит одним запросом, т.е. возвращаются данные в виде нескольких DataSet-ов. Вот и вопрос как это в delphi получить? У меня при таком запросе в Profiler тоже видно, что все одним запросом на сервак ушло, а вот возвращает только значение первого запроса. А как с union работать это любой начинающий знает, тут проблема то не в этом.
Johnmen
Дата: 09.12.2007 21:25:45
Joenka
...

Программка возвращает результаты всех запросов. Просто результаты разных запросов лежат в разных рекордсетах ADOCommand'а. Вот к ним и надо обращаться.
См. метод Execute адокомманда, метод NextRecordset для рекорседа и т.д. и т.п.
Альт
Дата: 09.12.2007 21:30:06
К чему этот тихий бунт... открывали и qa и что только не открывали... сумеете разобрать запрос до командных разделителей... то выполните отдельно несколь последовательных запросов... вот вам и отдельные выборки в раздельных дбгридах... про второй вариант "рекордсеты в одной выборке и дбгриды" уже написал... доброй ночи
Joenka
Дата: 09.12.2007 21:33:07
Johnmen
Joenka
...

Программка возвращает результаты всех запросов. Просто результаты разных запросов лежат в разных рекордсетах ADOCommand'а. Вот к ним и надо обращаться.
См. метод Execute адокомманда, метод NextRecordset для рекорседа и т.д. и т.п.



Хотелось бы коротенький примерчик. :(

Я делаю так:
Пользователь ввел в Memo1
sp_MShasdbaccess select getdate() select getdate()
Программка выполняет
ADOCommand1.CommandText:=Memo1.Text;
ADODataSet1.Recordset:=ADOCommand1.Execute;
DataSource1.DataSet:=ADODataSet1;
DataSourse1 в свойствах соединен с DBGrid1 и если вывести кол-во записей из ADODataSet1.Recordset - то оно равняется 6 - т.е. по запросу sp_MShasdbaccess действительно возвращается 6 записей в DBGrid. А вот где потерялись 2 записи select getdate()? :(
Anatoly Podgoretsky
Дата: 09.12.2007 21:37:55
Как где - в другом recordset
Joenka
Дата: 09.12.2007 21:38:54
Альт
К чему этот тихий бунт... открывали и qa и что только не открывали... сумеете разобрать запрос до командных разделителей... то выполните отдельно несколь последовательных запросов... вот вам и отдельные выборки в раздельных дбгридах... про второй вариант "рекордсеты в одной выборке и дбгриды" уже написал... доброй ночи



Но ведь qa то не разбивает все на отдельные запросы. Это четко видно в Profiler - как же тогда qa то на dbgrid-ы разбивает? А про попытку разобрать запрос до командных разделителей - вот это точно из серии фантастики - это же такой анализ с текстом надо проводить - застрелиться запросы то они бывают еще какие ооооогррооомные и написанные через черт его знает сколько inner join-ов в лучшем случае или через in (select id from table where t in (select t from tabl12 where ) ) - пока пропарсишь такое можно и состариться :)
Joenka
Дата: 09.12.2007 21:40:19
Anatoly Podgoretsky
Как где - в другом recordset



Как до него добраться. Примерчик если можно :(
Anatoly Podgoretsky
Дата: 09.12.2007 21:42:01
Joenka
Anatoly Podgoretsky
Как где - в другом recordset



Как до него добраться. Примерчик если можно :(

Изучай АДО - это не просто
автор
Note: Use of Recordset to directly access the underlying ADO recordset object requires a good working knowledge of ADO objects in general and the ADO recordset object in particular. Using recordset is not recommended unless you are familiar with recordset object operations. Consult the Microsoft Data Store SDK help for specific information on using recordset objects.

Ты фальярнен?