for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата: 01.06.06 09:59:27
На форме организован ввод некоторых данных (Ид.номер,Фамилия, имя и т.д.), из которых
сормировано условие отбора для отправки на сервер
(например:
m.lcSqlOtb=m.lcSqlOtb+' fm'+m.uslFm+'?THISFORM.txtFm.value '  
  m.lcSqlOtb='SELECT * FROM arhivpd WHERE '+m.lcSqlOtb
Этот запрос посылаю на сервер - для чего описала дополнительный метод
SQLSETPROP(m.ghServer, 'Asynchronous',.t.)  
  SQLSETPROP(m.ghServer,'BatchMode',.f.)  
  DO WHILE .t.  
   result=SQLEXEC(m.ghServer, m.lcSqlOtb,'vrem')  
   IF result<0  
    =AERROR(lErr)  
    MESSAGEBOX('Ошибка N '+STR(lErr(1))+' '+lErr(2),0,' ')  
    EXIT  
   ENDIF  
   IF result>1000  
    MESSAGEBOX('Кол-во записей больше допустимог.Уточните критерии отбора',0,' ')  
    EXIT  
   ENDIF   
   IF SQLMORERESULTS(m.ghServer)=2  
      EXIT  
   ENDIF      
  ENDDO

Выдается ошибка (при обращении к выражению IF SQLMORERESULTS(m.ghServer)=2 ) с номером 1474: Invalid call issued while executing a SQLEXEC( ) sequence. (1474):
При выполнении цепочки функций SQLEXEC( )был сделан недопустимый вызов
Что я неправильно сделала? Кстати, result у меня > 0, но никакого курсора не образовалось... (У меня VFP9)
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
AleksM

Сообщений: 17725
Дата: 01.06.06 10:01:27
Цитата:
m.lcSqlOtb=m.lcSqlOtb+' fm'+m.uslFm+'?THISFORM.txtFm.value '
Я бы не использовал в запросе объекты формы


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата: 01.06.06 11:04:14
Я это учту, конечно, но сейчас сам запрос m.lcSqlOtb сформировался верно (проверила ч/з трассировщик)
Result оказался равным 0, т.е. получается, что SQLEXEC продолжает выполняться.
Подскажите, как правильно обрабатывать данные в асинхронном режиме (это все сделала для того, чтобы ограничить число возвращаемых записей на клиент)
Спасибо!
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Aleksey Tsingauz [MSFT]

Сообщений: 407
Дата: 01.06.06 11:21:47
iren
SQLSETPROP(m.ghServer, 'Asynchronous',.t.)  
  SQLSETPROP(m.ghServer,'BatchMode',.f.)

SQLMORERESULTS можно использовать только если BatchMode=.T., подробное объяснение можно найти в разделе документации "Processing Multiple Result Sets".

iren
  
     result=SQLEXEC(m.ghServer, m.lcSqlOtb,'vrem')    
     ...  
     IF result>1000    
      MESSAGEBOX('Кол-во записей больше допустимог.Уточните критерии отбора',0,' ')    
      EXIT    
     ENDIF

result - это не количество записей.
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Владимир Максимов

Сообщений: 13872
Откуда: Москва
Дата: 01.06.06 13:13:11
Общая схема работы в асинхронном режиме примерно такая

SQLSETPROP(m.ghServer, 'Asynchronous',.t.)  
  result=SQLEXEC(m.ghServer, m.lcSqlOtb,'vrem')    
    
 * Бесконечный цикл ожидания окончания выполнения асинхронного запроса  
  DO WHILE result = 0  
 	* Для проверки факт продолжения выполнения запроса  
 	* пытаемся послать на сервер пустой запрос  
  	result = SQLEXEC(m.ghServer,'')  
  ENDDO  
    
  if result = -1  
  	=AERROR(lErr)    
  	MESSAGEBOX('Ошибка N '+STR(lErr(1))+' '+lErr(2),0,' ')    
  endif

К сожалению, как определить сколько записей УЖЕ скачано пока процесс не завершен - непонятно. Можно только перед выполнение запроса послать аналогичный запрос, но для подсчета количества записей в результате.
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
piva

Сообщений: 18600
Откуда: Курган
Дата: 01.06.06 13:39:44
Цитата:
SQLEXEC(nStatementHandle [, cSQLCommand [, cCursorName[, aCountInfo]]])
Вот как раз aCountInfo и покажет - Алексей в Бете подсказал про этот параметр, только тогда он был не массивом
ЗЫ - раз речь идет именно о 9-ке


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Владимир Максимов

Сообщений: 13872
Откуда: Москва
Дата: 01.06.06 13:57:22
piva
Цитата:
SQLEXEC(nStatementHandle [, cSQLCommand [, cCursorName[, aCountInfo]]])
Вот как раз aCountInfo и покажет - Алексей в Бете подсказал про этот параметр, только тогда он был не массивом
ЗЫ - раз речь идет именно о 9-ке
В асинхронном режиме эта штука не работает

Однако примерное количество записей можно получить через команду GO примерно так:

  
  SQLSETPROP(m.ghServer, 'Asynchronous',.t.)    
  result=SQLEXEC(m.ghServer, m.lcSqlOtb,'vrem')      
    
 * Бесконечный цикл ожидания окончания выполнения асинхронного запроса    
  DO WHILE result = 0    
 	* Для проверки факт продолжения выполнения запроса    
  	* пытаемся послать на сервер пустой запрос    
    	result = SQLEXEC(m.ghServer,'')    
  	  
  	select vrem  
  	IF Recno() < 1000  
  		TRY  
  			GO 1000  
  			result = SQLCancel(m.ghServer)  
  			MESSAGEBOX('Кол-во записей больше допустимог.Уточните критерии отбора',0,' ')   
  			EXIT  
  		CATCH  
 			* В выборке меньше, чем 1000 записей. Ничего не делаем  
  		ENDTRY  
  	ENDIF  
  ENDDO    
        
  if result = -1    
    	=AERROR(lErr)      
    	MESSAGEBOX('Ошибка N '+STR(lErr(1))+' '+lErr(2),0,' ')      
  endif

К недостаткам этого метода можно отнести то, что команда GO фактически переводит выполнение запроса в синхронный режим, потому, что пока выборка не будет закончена или пока количество записей в выборке не превысит установленного порога команда GO просто не будет выполнена. Точнее, она будет ждать пока сможет перейти на указанную запись или сообщить, что это невозможно.

Но, судя по поставновке задачи именно это и требуется.
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
piva

Сообщений: 18600
Откуда: Курган
Дата: 01.06.06 13:59:10
В асинхронном я не проверял - хотя можно было догадаться - правда в Хелпе по этому поводу не нашел примечания


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата: 01.06.06 17:46:24
Спасибо!
Почитала на форуме ваши сообщения, а также ваши ответы на мой вопрос. Стало немного понятнее.
Буду смотреть дальше...
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Aleksey Tsingauz [MSFT]

Сообщений: 407
Дата: 03.06.06 07:14:01
Владимир Максимов
В асинхронном режиме эта штука не работает

Однако примерное количество записей можно получить через команду GO

Здравствуйте, Владимир!

Это почему же не работает? Очень даже работает. И количество записей скаченных на текущий момент можно узнать с помощью CURSORGETPROP("RecordsFetched").

  
  CLEAR  
    
  CURSORSETPROP("FetchSize",10,0)  
  CURSORSETPROP("FetchAsNeeded",.T.,0)  
    
  con=SQLCONNECT("Localserver")  
  SQLSETPROP(con,"Asynchronous",.T.)  
    
  PUBLIC ARRAY acountInfo(1)   
    
  result = SQLEXEC(con,"select TOP 43 * from Northwind..Customers;"+ ;  
  				"select top 35 * from Northwind..Products","", acountInfo)  
  num=1  
  DO WHILE result = 0      
  	DispalyFetchStatus(num)  
  	  
  	* Для проверки факт продолжения выполнения запроса      
   	* пытаемся послать на сервер пустой запрос      
  	result = SQLEXEC(con,'','',acountInfo)      
  	num = num + 1   
  ENDDO      
            
  if result = -1      
  	=AERROR(lErr)        
  	MESSAGEBOX('Ошибка N '+STR(lErr(1))+' '+lErr(2),0,' ')  
  ELSE  
  	DispalyFetchStatus(num)  
  endif  
    
  SQLDISCONNECT(con)  
    
  RETURN   
    
  FUNCTION DispalyFetchStatus(num)  
  	? "------- SQLEXEC #", num,"-------"  
  	FOR I=1 TO ALEN(acountInfo,1)  
  		IF acountInfo(I,1)!="0"  
  			? acountInfo(I,1)+":", "Fetched now:", acountInfo(I,2), ;  
  				"Total Fetched:", CURSORGETPROP("RecordsFetched",acountInfo(I,1))  
  		ENDIF  
  	NEXT	  
  	?  
  ENDFUNC

Результат:
  
  ------- SQLEXEC #           1 -------  
    
  ------- SQLEXEC #           2 -------  
  SQLRESULT:   Fetched now:          10 Total Fetched:         10  
    
  ------- SQLEXEC #           3 -------  
  SQLRESULT:   Fetched now:          10 Total Fetched:         20  
    
  ------- SQLEXEC #           4 -------  
  SQLRESULT:   Fetched now:          10 Total Fetched:         30  
    
  ------- SQLEXEC #           5 -------  
  SQLRESULT:   Fetched now:          10 Total Fetched:         40  
    
  ------- SQLEXEC #           6 -------  
  SQLRESULT:   Fetched now:           3 Total Fetched:         43  
  SQLRESULT1:   Fetched now:          10 Total Fetched:         10  
    
  ------- SQLEXEC #           7 -------  
  SQLRESULT1:   Fetched now:          10 Total Fetched:         20  
    
  ------- SQLEXEC #           8 -------  
  SQLRESULT1:   Fetched now:          10 Total Fetched:         30  
    
  ------- SQLEXEC #           9 -------  
  SQLRESULT1:   Fetched now:           5 Total Fetched:         35

Алексей.
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата: 05.06.06 14:48:40
У меня в курсор все равно попадает весь набор данных.
Написала такой код:

**Устанавливаем св-ва соединения  
  SQLSETPROP(m.ghServer, 'Asynchronous',.T.)  
  CURSORSETPROP('FetchAsNeeded',.T.,0)  
  CURSORSETPROP('FetchSize',100,0)  
    
  result=SQLEXEC(m.ghServer, m.lcSqlOtb,'MyResult')  
  m.lnSek=SECONDS( )  
  DO WHILE NOT USED('MyResult')  
   result=SQLEXEC(m.ghServer, m.lcSqlOtb,'MyResult')  
   IF SECONDS( )-m.lnSek>10  
      MESSAGEBOX('Неверно составлен запрос.Обратитесь к программисту',0,' ')      
      SQLDISCONNECT(m.ghServer)  
   Endif     
  Enddo  
    
    
  DO WHILE  result=0  
   * Для проверки факт продолжения выполнения запроса        
   * пытаемся послать на сервер пустой запрос        
   result=SQLEXEC(m.ghServer,'')   
   SELECT MyResult    
   IF RECNO()<1000  
    TRY  
     GO 1000  
     MESSAGEBOX('Кол-во записей больше допустимог.Уточните критерии отбора',0,' ')     
        SUSP  
     EXIT   
    CATCH  
   * В выборке меньше, чем 1000 записей. Ничего не делаем    
    ENDTRY  
   ENDIF    
  ENDDO  
  IF result=-1      
    =AERROR(lErr)  
    MESSAGEBOX('Ошибка N '+STR(lErr(1))+' '+lErr(2),0,' ')   
  ENDIF  
  SUSP
Пока не вставила блок:
Do while Not Used('MyResult')  
  Enddo
У меня выдавалось сообщение о том, что алиас MyResult не найден
В блоке TRU поставила SUSP, смотрю курсор MyResult, но там уже весь набор данных, а не первая 1000,которую я хочу показать клиенту.

Попробовала заменить блок
DO while result=0
на следующий:
m.lnRecordsInterval=CURSORGETPROP("FetchSize","MyResult")  
  m.lnRecordsTotal=m.lnRecordsInterval  
    
  DO WHILE  result=0  
     result=SQLEXEC(m.ghServer,'')   
     m.lnRecordsTotal=m.lnRecordsTotal+m.lnRecordsInterval  
     If m.lnRecordsTotal>1000  
       MESSAGEBOX('Колво записей больше допустимого',0,' ')     
       EXIT  
     Endif    
    
     WAIT WINDOW "Выборка записей "+STR(m.lnRecordsTotal) NOWAIT NOCLEAR  
       
       
  ENDDO

Но снова в курсоре MyResult весь результат выборки, а не 1000 записей.
Подскажите, в чем моя ошибка?
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата: 05.06.06 15:29:17
Так естественно, результатом будут все записи, которые попадают в критерии SELECT.
Чтобы оценить количесто, надо предварительно использовать SELECT count(*) FROM ...
Приходят ведь уже все выбранные записи, но в силу ограничения скорости передачи
в течение какого-то времени.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено: Влад Колосов, 05.06.06 15:30
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата: 05.06.06 17:23:24
А я хочу получить порцию записей, вывести эту порцию клиенту вместе с сообщением, что "отобрано 1000 записей." и просьбой уточнить параметры.
Формирую запрос для посылки, например,
select top 100 * from arhivpd where fm like 'О%'
и получаю сообщение:
INCORRECT SYNTAX NEAR 100

Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Naomi

Сообщений: 1796
Дата: 05.06.06 17:24:21
ORDER BY ???
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Naomi

Сообщений: 1796
Дата: 05.06.06 17:25:59
BTW, MESSAGEBOX('Кол-во записей больше допустимог.Уточните критерии отбора',0,' ')
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата: 05.06.06 18:05:27
Order BY
не помог.
Написала:
select top 100 * from arhivpd where fm like 'О%' order by 1 (попробовала через QA пропустить)- по-прежнему

INCORRECT SYNTAX NEAR 100
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
PaulWist

Сообщений: 13544
Дата: 05.06.06 18:28:29
Что-то не верится

create table #t (id int, Name char(10))  
    
  insert into #t (id, name) select 1, 'One' union select 2, 'Two'  
    
  select top 1 * from #t order by 1


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Naomi

Сообщений: 1796
Дата: 05.06.06 18:58:17
Попробуйте все поля перечислить в Select.



Исправлено: Naomi, 05.06.06 19:10
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Aleksey Tsingauz [MSFT]

Сообщений: 407
Дата: 05.06.06 22:52:12
iren
Но снова в курсоре MyResult весь результат выборки, а не 1000 записей.
Подскажите, в чем моя ошибка?

Здравствуйте, Iren!

Я бы написал это примерно вот так:
  
  CLEAR  
    
  CURSORSETPROP("FetchSize",10,0)  
  CURSORSETPROP("FetchAsNeeded",.T.,0)  
    
  con=SQLCONNECT("Localserver")  
    
 * Для отладки   
  SQLEXEC(con,"select COUNT(*) as _Cnt from Northwind..Customers",'CountInfo')  
  ?"Total records in the table:", CountInfo._Cnt  
  USE IN CountInfo  
    
  SQLSETPROP(con,"Asynchronous",.T.)  
    
    
  result = SQLEXEC(con,"select * from Northwind..Customers",'MyResult')  
    
  DO WHILE result=0 AND NOT USED('MyResult')    
     result=SQLEXEC(con, '','MyResult')    
  Enddo    
    
  IF USED('MyResult')  
  	CURSORSETPROP("FetchAsNeeded",.T.,'MyResult')  
  ENDIF  
    
  DO WHILE  result=0    
     result=SQLEXEC(con,'')     
       
     IF CURSORGETPROP("RecordsFetched", 'MyResult')>35  
  		SQLCANCEL(con)  
  		result=1  
  		MESSAGEBOX('Too many records!!!',0,' ')       
     ENDIF  
  ENDDO    
    
  IF result=-1        
      =AERROR(lErr)    
      DISPLAY MEMORY LIKE lErr  
  ENDIF    
    
  ? "Total records fetched:", RECCOUNT('MyResult')  
    
  SQLDISCONNECT(con)

Результат:
  
  Total records in the table:          91  
  Total records fetched:         40

Алексей.
Ratings: 0 negative/0 positive

Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата: 06.06.06 12:09:30
Цитата:
select top 100 * from arhivpd

arhivpd небось view? Ошибка в этом view.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 20 medstrax Chemberzhy Guest (Гостей: 17)

24.01.2021 17:45:16 exec: 0.42
Mem: 1.476 Mb

© 2000-2021 Fox Club 
Яндекс.Метрика