:: Visual Foxpro, Foxpro for DOS
Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата регистрации: 28.10.2003
На форме организован ввод некоторых данных (Ид.номер,Фамилия, имя и т.д.), из которых
сормировано условие отбора для отправки на сервер
(например:
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

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


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата регистрации: 28.10.2003
Я это учту, конечно, но сейчас сам запрос m.lcSqlOtb сформировался верно (проверила ч/з трассировщик)
Result оказался равным 0, т.е. получается, что SQLEXEC продолжает выполняться.
Подскажите, как правильно обрабатывать данные в асинхронном режиме (это все сделала для того, чтобы ограничить число возвращаемых записей на клиент)
Спасибо!
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Aleksey Tsingauz [MSFT]

Сообщений: 407
Дата регистрации: 15.06.2004
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 !
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Общая схема работы в асинхронном режиме примерно такая

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

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


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
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

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


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата регистрации: 28.10.2003
Спасибо!
Почитала на форуме ваши сообщения, а также ваши ответы на мой вопрос. Стало немного понятнее.
Буду смотреть дальше...
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Aleksey Tsingauz [MSFT]

Сообщений: 407
Дата регистрации: 15.06.2004
Владимир Максимов
В асинхронном режиме эта штука не работает

Однако примерное количество записей можно получить через команду 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
Дата регистрации: 28.10.2003
У меня в курсор все равно попадает весь набор данных.
Написала такой код:

**Устанавливаем св-ва соединения
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.05.2005
Так естественно, результатом будут все записи, которые попадают в критерии SELECT.
Чтобы оценить количесто, надо предварительно использовать SELECT count(*) FROM ...
Приходят ведь уже все выбранные записи, но в силу ограничения скорости передачи
в течение какого-то времени.


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




Исправлено 1 раз(а). Последнее : Влад Колосов, 05.06.06 15:30
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

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

Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Naomi

Сообщений: 1796
Дата регистрации: 09.10.2003
ORDER BY ?
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Naomi

Сообщений: 1796
Дата регистрации: 09.10.2003
BTW, MESSAGEBOX('Кол-во записей больше допустимог.Уточните критерии отбора',0,' ')
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
iren
Автор

Сообщений: 511
Дата регистрации: 28.10.2003
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

Сообщений: 14601
Дата регистрации: 01.04.2004
Что-то не верится

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
Дата регистрации: 09.10.2003
Попробуйте все поля перечислить в Select.



Исправлено 1 раз(а). Последнее : Naomi, 05.06.06 19:10
Ratings: 0 negative/0 positive
Re: Ошибка SQLEXEC() и SQLMORERESULTS !
Aleksey Tsingauz [MSFT]

Сообщений: 407
Дата регистрации: 15.06.2004
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
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Цитата:
select top 100 * from arhivpd

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


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


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

On-line: 35 (Гостей: 35)

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