Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Cursoradapter  [new]
Kinetix
Member

Откуда: Екатеринбург
Сообщений: 11
У меня возникла проблема с cursoradapter при параллельной работе в разных формах.

При запуске своей программы в main.prg я создаю коннект к SQL Server и храню его в переменной gnConn = SQLSTRINGCONNECT ....

В форме, в методе Init я программно добавляю cursoradapter в dataenvironment.

THISFORM.dataenvironment.AddObject("Sqlexec1","cursoradapter")

В методе Click кнопки на форме я закачиваю данные с сервера

WITH THISFORM.dataenvironment.sqlexec1

 .DATASOURCE = gnConn
 .DATASOURCETYPE = "ODBC"
 .ALIAS = "mytov"
 .SELECTCMD = "Select Nam From SprTov"
 
 IF .CURSORFILL() = .T.
   BROWSE
 ENDIF
ENDWITH

Когда форма запущена в единственном экземпляре, то все работает прекрасно. Но стоит только запустить такую же форму во втором экземпляре, то на второй форме тот же самый код не работает, хотя на первом экземпляре все продолжает работать. Но стоит только закрыть первый экземпляр формы, то на втором все начинает работать! Складывается такое впечатление что cursoradapter хочет работать только в единственном экземпляре, несмотря на то, что он добавлен в dataenvironment формы, у которой datasession=private! И если открыть другие формы, то cursoradapter на первой открытой форме как бы "мешает" нормальной работе cursoradapter остальных форм!

Я пробовал создавать cursoradapter через createobject и хранить ссылку в property-формы

THISFORM.osql = CREATEOBJECT("Cursoradapter")

WITH THISFORM.osql

 .DATASOURCE = gnConn
 .DATASOURCETYPE = "ODBC"
 .ALIAS = "mytov"
 .SELECTCMD = "Select Nam From SprTov"
 
 IF .CURSORFILL() = .T.
   BROWSE
 ENDIF
ENDWITH

В данном случае код тоже нормально работает в ПЕРВОЙ открытой форме, а если открывать другие формы с таким же кодом работы с cursoradapter то на них ничего не работает!
9 ноя 04, 09:37    [1090372]     Ответить | Цитировать Сообщить модератору
 Re: Cursoradapter  [new]
Kinetix
Member

Откуда: Екатеринбург
Сообщений: 11
В дополнение:

Если при входе в программу сделать два коннекта
gnConn1 = SQLCONNECT ...
gnConn2 = SQLCONNECT ...

И в одной форме при работе с cursoradapter использовать gnConn1, а в другой форме использовать gnConn2, то все работает прекрасно на обоих формах одновременно. Т.е. получается что cursoradapter "захватывает" коннект и не дает другим экземплярам cursoradapter работать с коннектом ???
9 ноя 04, 10:34    [1090538]     Ответить | Цитировать Сообщить модератору
 Re: Cursoradapter  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

Hi Kinetix!

Попробуй использовать SQLCONNECT(gnConn) - как "источник данных" для
адаптера - всё-же в VFP8 существенно изменён механизм работы этих функций -
читай хелп на предмет того что есть коннект-хендл, а что - statement handle.
Учти, что к одному коннект-хендлу можно создать много стэйтмент-хендлов
(т.е. на сервере число коннекций не изменится).

Posted via ActualForum NNTP Server 1.1

10 ноя 04, 02:30    [1093081]     Ответить | Цитировать Сообщить модератору
 Re: Cursoradapter  [new]
Kinetix
Member

Откуда: Екатеринбург
Сообщений: 11
Igor Korolyov

Hi Kinetix!

Попробуй использовать SQLCONNECT(gnConn) - как "источник данных" для
адаптера - всё-же в VFP8 существенно изменён механизм работы этих функций -
читай хелп на предмет того что есть коннект-хендл, а что - statement handle.
Учти, что к одному коннект-хендлу можно создать много стэйтмент-хендлов
(т.е. на сервере число коннекций не изменится).

Posted via ActualForum NNTP Server 1.1


Спасибо за совет Игорь. Я уже разобрался. Причина была банальной - в классе cursoradapter по умолчанию стоит FetchSize=100, а команда BROWSE отрабатывает сразу, как только после выполения CURSORFILL возвращается первые 100 записей. Таблица, с которой я работал, содержит около 20.000 записей, т.е. я, видя что BROWSE выполнился, переключался на другую форму и пытался запускать выборку, в которой использовался тот же самый хэндл соединения. Естественно, в предыдущей форме cursoradapter продолжал подкачивать данные по 100 записей, и следовательно connection was busy. Я исправил FetchSize на -1 и теперь BROWSE выполняется только после закачки всех данных с сервера.
10 ноя 04, 07:19    [1093131]     Ответить | Цитировать Сообщить модератору
 Re: Cursoradapter  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

Hi Kinetix!

Я опасаюсь что у тебя могут возникнуть проблемы при (последующей) попытке
обновления данных - т.е. когда скажем форма 1 снова захочет использовать эту
конекцию... Т.е. я не уверен - будет ли реально CA создавать отдельные
statement handle для каждого своего инстанса, или всё будет нормально и при
работе через один statement... Т.е. надо дальше пробовать... Ну а проверять
connect handle на предмет "Busy" никогда не повредит :)

P.S. Надеюсь ты в реальных условиях ограничишь выборки и не будешь тянуть по
20 000 записей на клиента?

Posted via ActualForum NNTP Server 1.1

11 ноя 04, 00:37    [1096703]     Ответить | Цитировать Сообщить модератору
 Re: Cursoradapter  [new]
Kinetix
Member

Откуда: Екатеринбург
Сообщений: 11
Igor Korolyov

Hi Kinetix!

Я опасаюсь что у тебя могут возникнуть проблемы при (последующей) попытке
обновления данных - т.е. когда скажем форма 1 снова захочет использовать эту
конекцию... Т.е. я не уверен - будет ли реально CA создавать отдельные
statement handle для каждого своего инстанса, или всё будет нормально и при
работе через один statement... Т.е. надо дальше пробовать... Ну а проверять
connect handle на предмет "Busy" никогда не повредит :)

P.S. Надеюсь ты в реальных условиях ограничишь выборки и не будешь тянуть по
20 000 записей на клиента?

Posted via ActualForum NNTP Server 1.1


Я пересмотрел концепцию работы с ca после нескольких экспериментов, теперь я для каждого курсора в отдельной форме создаю в dataenvironment отдельный экземпляр cursoradapter через addobject. Конечно, 20000 записей на клиента я тянуть никогда не буду, я просто эксперементировал с этим классом.
11 ноя 04, 07:21    [1096853]     Ответить | Цитировать Сообщить модератору
 Re: Cursoradapter  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

Hi Kinetix!

Надеюсь они создаются "вовремя", т.е. до того как злые конторлы с формы
затребуют себе данные :) Или ты BindControls пользуешь?

Posted via ActualForum NNTP Server 1.1

12 ноя 04, 01:29    [1100150]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить