|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
Стыдно признаться, но вот незнаю как в хранимой процедуре указать, чтобы она вернула не одно скалярное значение, а результирующий курсор (от команды SQL). В хелпе по RETURN ничего такого не написано. Вариант CURSORTOXML не пойдет. Принимающая сторона не умеет работать с XML (или незнаю, что она это умеет). Зачем это нужно ? Ну из JScript`а хочу вызвать хранимую процедуру (через VFPOLEDB Provider, используем ADODB), чтобы она чего-то там поделала и вернула результат работы как набор данных (как-то так var RecSet=oCommand.Execute("sp_getanything")). Можно, конечно, обойти эту траблу тем, что ХП будет возвращать кажем текстовую строку с готовым HTML кодом, но это не хорошо. Может кто наставит на путь истинный. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2009, 22:44 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
Для FoxPro таблица - это не переменная. Поэтому работать с ней как с переменной - невозможно. Т.е. через Return вернуть таблицу невозможно "по определению". Подключаться из-вне к базе FoxPro по ADO не пробовал, поэтому, все дальнейшее, это лишь мои предположения. Может сработает, а может и нет. Надо экспериментировать... 1. В ХП непосредственно перед командой RETURN просто выполнить Select-SQL. Возможно, результат этого запроса будет интерпретирован ADO как возвращаемая выборка. Чтобы не мусорить в среде FoxPro, можно сделать выполнение этого запроса в зависимости от параметра. 2. В ХП сделать Select-SQL, но результат выборки сохранить в курсоре (SELECT ... INTO CURSOR ...), а затем следующей командой сделать выборку из этого курсора. Возможно, это можно организовать одним пакетом (одной командой ADO). Возможно, через RETURN возвращать имя курсора, если ХП отработала успешно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2009, 11:46 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
ВладимирМ, Спасибо, Владимир, что откликнулись. Второй вариант мне приходил в голову, но смутил его "неказистый" вид. Тем не менее, еще раз спасибо. Будут рыть. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2009, 20:12 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
Видать, придётся оставить эту затею, не возвращается в AORecordSet фоксовский курсор через ХП или ф-ию. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2009, 14:31 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
Через Курсорадаптер нельзя? Не совсем понимаю задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2009, 15:44 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
FfffffffffffffffЧерез Курсорадаптер нельзя? Не совсем понимаю задачу. Автор из JScript`через ADO хочет вызвать фоксовую ХП, которая формирует какой-то курсор и этим вызовом наполнить ADORecordSet, НО фоксовая ХП возвращает, что что написно в return (те теоретически можно извернуться, что бы наполнить рекордсет, но это будет извратом, либо я не знаю какого то пути) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2009, 22:19 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
Итак ! Немного помучавшись получил такой результат: JScript: oConn = Server.CreateObject("ADODB.Connection"); oConn.ConnectionString ="Provider=VFPOLEDB.1;Data Source=<диск>:<каталог1>\\<каталог2>\\<файл.dbc>;Mode=ReadWrite|Share Deny None;"; oConn.CursorLocation=3; oConn.Open(); if (oConn.State == 1) { oCommand = Server.CreateObject("ADODB.Command"); oCommand.ActiveConnection = oConn; oCommand.CommandType = 1; oCommand.CommandText = "sp_login('"+Request.QueryString("name")+"','"+Request.QueryString("psw")+"')"; // Выполняем ХП, результатом которой должен быть некий набор данных, сохранённый в временную таблицу. Название этой таблицы возвращает ХП в виде строки. var tabname = oCommand.Execute(); // А теперь делаем запрос из той самой временной таблице с нашим результатом. oCommand.CommandText = "select * from "+tabname.Fields(0).value; // tabname.Fields(0).value - такая форма приведена на сайте MS и почему-то по другому не робит. goRS = oCommand.Execute(); if(goRS.RecordCount>0) { // делаем чего-нибудь с полученными строками } } Вот столкнулся со странной проблемой. Если в возвращаемом курсоре из ХП или по средством pass-throuth SELECT`ом есть столбец в типом DATE, то его ADODB не хотит ни в какую обрабатывать в стороке, например такой, <% =oRS.Fields("date").Value > Долго мучился пока доперло из-за чего ошибка. Поборол так: SELECT dtoc(tab1.date) as date from tab1 строки и числа обрабатываются нормально. Никто незнает чё за борода ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2009, 23:37 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
Забыл код в ХП привести FUNCTION sp_login(_name, _psw) LOCAL m.aliasname, result m.aliasname=SYS(2015) SELECT * FROM databd!anytable INTO TABLE (m.aliasname) ORDER BY 1,2 m.result=DBF(m.aliasname) USE IN anytable RETURN m.result ENDFUNC Естественно незабываем, что в FREE TABLE длинна названия поля обрежется до 10 символов. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2009, 23:44 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
Под термином "курсор" или "временная таблица" в FoxPro понимается таблица, полученная примерно так Код: plaintext
или так Код: plaintext 1. 2.
Если же Вы используете синтаксис INTO TABLE, то получаете постоянную таблицу. Файл DBF. Который надо будет потом не забыть явно удалить с диска. Отличие курсора как раз в том и заключается, что он будет удален автоматически при его закрытии или при закрытии FoxPro (соединения). Ну, и курсор поддерживает длинные имена полей (более 10 символов). Насчет типа данных Date - это зависит от того, понимает ли та среда, в которой Вы читаете RecordSet подобный тип данных. Т.е. дату без времени. Не все среды программирования имеют подобный тип данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2009, 12:17 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
PaulWistВидать, придётся оставить эту затею, не возвращается в AORecordSet фоксовский курсор через ХП или ф-ию. А никто не пробовал использовать функцию: SETRESULTSET( nWorkArea | cTableAlias ) Вроде для этих целей предназначена, но никогда ею сам не пользовался... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2009, 12:43 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
Zmej, Попробовал - работает ! Вот ведь ! А ларчик-то просто открывался ! Действительно: век живи - век учись. Спасибо Zmej ! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2009, 20:43 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
thunder2Zmej, Попробовал - работает ! Вот ведь ! А ларчик-то просто открывался ! Действительно: век живи - век учись. Спасибо Zmej ! Действительно так можно вернуть курсор из ХП. НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2009, 23:49 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
PaulWist НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table. Достаточно добавить параметр в ХП и в зависимости от значения параметра использовать или не использовать SETRESULTSET() Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2009, 18:10 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
PaulWist НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table. А какие могут быть фатальные последствия при вызове SETRESULTSET() из фокса, а не из ADO? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2009, 20:27 |
|
Возврат SQL курсора из ХП
|
|||
---|---|---|---|
#18+
ZmejА какие могут быть фатальные последствия при вызове SETRESULTSET() из фокса, а не из ADO? Никаких, за исключением если return из ХП не используется в бизнес логике. В принципе, как вариант можно попробовать написать ХП с SETRESULTSET() в которой внутри вызвать фоксовую ХП, надо проверять. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2009, 20:51 |
|
|
start [/forum/topic.php?fid=41&msg=36393006&tid=1585718]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 135ms |
0 / 0 |