![]() |
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум | ![]() |
![]() |
Лисоводы всех стран, объединяйтесь !!! |
Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
iren Автор Сообщений: 511 |
На форме организован ввод некоторых данных (Ид.номер,Фамилия, имя и т.д.), из которых
сормировано условие отбора для отправки на сервер (например: 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) ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
AleksM Сообщений: 17725 |
Цитата:Я бы не использовал в запросе объекты формы ------------------ Лучше переесть, чем недоспать.
Не спеши, а то успеешь. ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
iren Автор Сообщений: 511 |
Я это учту, конечно, но сейчас сам запрос m.lcSqlOtb сформировался верно (проверила ч/з трассировщик)
Result оказался равным 0, т.е. получается, что SQLEXEC продолжает выполняться. Подскажите, как правильно обрабатывать данные в асинхронном режиме (это все сделала для того, чтобы ограничить число возвращаемых записей на клиент) Спасибо! ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Aleksey Tsingauz [MSFT] Сообщений: 407 |
SQLMORERESULTS можно использовать только если BatchMode=.T., подробное объяснение можно найти в разделе документации "Processing Multiple Result Sets".
result - это не количество записей. ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Владимир Максимов Сообщений: 13872 Откуда: Москва |
Общая схема работы в асинхронном режиме примерно такая
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 К сожалению, как определить сколько записей УЖЕ скачано пока процесс не завершен - непонятно. Можно только перед выполнение запроса послать аналогичный запрос, но для подсчета количества записей в результате. ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
piva Сообщений: 18600 Откуда: Курган |
Цитата:Вот как раз aCountInfo и покажет - Алексей в Бете подсказал про этот параметр, только тогда он был не массивом ![]() ЗЫ - раз речь идет именно о 9-ке ------------------ Часто бывает так, что есть над чем задуматься, а нечем. ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Владимир Максимов Сообщений: 13872 Откуда: Москва |
В асинхронном режиме эта штука не работает ![]() Однако примерное количество записей можно получить через команду 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 просто не будет выполнена. Точнее, она будет ждать пока сможет перейти на указанную запись или сообщить, что это невозможно. Но, судя по поставновке задачи именно это и требуется. ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
piva Сообщений: 18600 Откуда: Курган |
В асинхронном я не проверял - хотя можно было догадаться - правда в Хелпе по этому поводу не нашел примечания
------------------ Часто бывает так, что есть над чем задуматься, а нечем. ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
iren Автор Сообщений: 511 |
Спасибо!
Почитала на форуме ваши сообщения, а также ваши ответы на мой вопрос. Стало немного понятнее. Буду смотреть дальше... ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Aleksey Tsingauz [MSFT] Сообщений: 407 |
Здравствуйте, Владимир! Это почему же не работает? Очень даже работает. И количество записей скаченных на текущий момент можно узнать с помощью 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 Алексей. ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
iren Автор Сообщений: 511 |
У меня в курсор все равно попадает весь набор данных.
Написала такой код: **Устанавливаем св-ва соединения 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 В блоке 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 записей. Подскажите, в чем моя ошибка? ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Влад Колосов Сообщений: 22664 Откуда: Ростов-на-Дону |
Так естественно, результатом будут все записи, которые попадают в критерии SELECT.
Чтобы оценить количесто, надо предварительно использовать SELECT count(*) FROM ... Приходят ведь уже все выбранные записи, но в силу ограничения скорости передачи в течение какого-то времени. ------------------ Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить. Исправлено: Влад Колосов, 05.06.06 15:30 ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
iren Автор Сообщений: 511 |
А я хочу получить порцию записей, вывести эту порцию клиенту вместе с сообщением, что "отобрано 1000 записей." и просьбой уточнить параметры.
Формирую запрос для посылки, например, select top 100 * from arhivpd where fm like 'О%' INCORRECT SYNTAX NEAR 100 ![]() ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Naomi Сообщений: 1796 |
ORDER BY ???
![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Naomi Сообщений: 1796 |
BTW, MESSAGEBOX('Кол-во записей больше допустимог.Уточните критерии отбора',0,' ')
![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
iren Автор Сообщений: 511 |
Order BY Написала: select top 100 * from arhivpd where fm like 'О%' order by 1 (попробовала через QA пропустить)- по-прежнему INCORRECT SYNTAX NEAR 100 ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
PaulWist Сообщений: 13544 |
Что-то не верится
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 ------------------ Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Naomi Сообщений: 1796 |
Попробуйте все поля перечислить в Select.
Исправлено: Naomi, 05.06.06 19:10 ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Aleksey Tsingauz [MSFT] Сообщений: 407 |
Здравствуйте, 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 Алексей. ![]() |
||
Re: Ошибка SQLEXEC() и SQLMORERESULTS ! | |||
---|---|---|---|
Влад Колосов Сообщений: 22664 Откуда: Ростов-на-Дону |
Цитата: arhivpd небось view? Ошибка в этом view. ------------------ Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить. ![]() |
||
© 2000-2021 Fox Club  |