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

Откуда:
Сообщений: 380
Стыдно признаться, но вот незнаю как в хранимой процедуре указать, чтобы она вернула не одно скалярное значение, а результирующий курсор (от команды SQL). В хелпе по RETURN ничего такого не написано. Вариант CURSORTOXML не пойдет. Принимающая сторона не умеет работать с XML (или незнаю, что она это умеет).

Зачем это нужно ?
Ну из JScript`а хочу вызвать хранимую процедуру (через VFPOLEDB Provider, используем ADODB), чтобы она чего-то там поделала и вернула результат работы как набор данных (как-то так var RecSet=oCommand.Execute("sp_getanything")).
Можно, конечно, обойти эту траблу тем, что ХП будет возвращать кажем текстовую строку с готовым HTML кодом, но это не хорошо.

Может кто наставит на путь истинный.
23 дек 09, 22:44    [8110357]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Для FoxPro таблица - это не переменная. Поэтому работать с ней как с переменной - невозможно. Т.е. через Return вернуть таблицу невозможно "по определению".

Подключаться из-вне к базе FoxPro по ADO не пробовал, поэтому, все дальнейшее, это лишь мои предположения. Может сработает, а может и нет. Надо экспериментировать...

1. В ХП непосредственно перед командой RETURN просто выполнить Select-SQL. Возможно, результат этого запроса будет интерпретирован ADO как возвращаемая выборка. Чтобы не мусорить в среде FoxPro, можно сделать выполнение этого запроса в зависимости от параметра.

2. В ХП сделать Select-SQL, но результат выборки сохранить в курсоре (SELECT ... INTO CURSOR ...), а затем следующей командой сделать выборку из этого курсора. Возможно, это можно организовать одним пакетом (одной командой ADO). Возможно, через RETURN возвращать имя курсора, если ХП отработала успешно.
24 дек 09, 11:46    [8112052]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
thunder2
Member

Откуда:
Сообщений: 380
ВладимирМ,

Спасибо, Владимир, что откликнулись. Второй вариант мне приходил в голову, но смутил его "неказистый" вид.
Тем не менее, еще раз спасибо. Будут рыть.
24 дек 09, 20:12    [8115741]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
Видать, придётся оставить эту затею, не возвращается в AORecordSet фоксовский курсор через ХП или ф-ию.
25 дек 09, 14:31    [8119021]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
Ffffffffffffffff
Guest
Через Курсорадаптер нельзя?
Не совсем понимаю задачу.
25 дек 09, 15:44    [8119580]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
Ffffffffffffffff
Через Курсорадаптер нельзя?
Не совсем понимаю задачу.


Автор из JScript`через ADO хочет вызвать фоксовую ХП, которая формирует какой-то курсор и этим вызовом наполнить ADORecordSet, НО фоксовая ХП возвращает, что что написно в return (те теоретически можно извернуться, что бы наполнить рекордсет, но это будет извратом, либо я не знаю какого то пути)
25 дек 09, 22:19    [8121030]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
thunder2
Member

Откуда:
Сообщений: 380
Итак !
Немного помучавшись получил такой результат:
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 дек 09, 23:37    [8135199]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
thunder2
Member

Откуда:
Сообщений: 380
Забыл код в ХП привести

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 дек 09, 23:44    [8135217]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Под термином "курсор" или "временная таблица" в FoxPro понимается таблица, полученная примерно так

SELECT ... INTO CURSOR (m.aliasname) NOFILTER

или так

CREATE CURSOR (m.aliasname) (Field1 C(10), Field2 D, ...)
INSERT INTO (m.aliasname) SELECT ... FROM

Если же Вы используете синтаксис INTO TABLE, то получаете постоянную таблицу. Файл DBF. Который надо будет потом не забыть явно удалить с диска.

Отличие курсора как раз в том и заключается, что он будет удален автоматически при его закрытии или при закрытии FoxPro (соединения). Ну, и курсор поддерживает длинные имена полей (более 10 символов).

Насчет типа данных Date - это зависит от того, понимает ли та среда, в которой Вы читаете RecordSet подобный тип данных. Т.е. дату без времени. Не все среды программирования имеют подобный тип данных.
30 дек 09, 12:17    [8136766]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
Zmej
Member

Откуда:
Сообщений: 32
PaulWist
Видать, придётся оставить эту затею, не возвращается в AORecordSet фоксовский курсор через ХП или ф-ию.

А никто не пробовал использовать функцию:
SETRESULTSET( nWorkArea | cTableAlias )
Вроде для этих целей предназначена, но никогда ею сам не пользовался...
30 дек 09, 12:43    [8136975]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
thunder2
Member

Откуда:
Сообщений: 380
Zmej,

Попробовал - работает !
Вот ведь ! А ларчик-то просто открывался !
Действительно: век живи - век учись.
Спасибо Zmej !
30 дек 09, 20:43    [8139345]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
thunder2
Zmej,

Попробовал - работает !
Вот ведь ! А ларчик-то просто открывался !
Действительно: век живи - век учись.
Спасибо Zmej !


Действительно так можно вернуть курсор из ХП.

НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table.
30 дек 09, 23:49    [8139667]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
PaulWist

НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table.

Достаточно добавить параметр в ХП и в зависимости от значения параметра использовать или не использовать SETRESULTSET()

FUNCTION sp_login(_name, _psw, _isResultSet)

(...)

IF _isResultSet = .T.
    return SETRESULTSET(...)
endif

return
ENDFUNC
31 дек 09, 18:10    [8141745]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
Zmej
Member

Откуда:
Сообщений: 32
PaulWist

НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table.

А какие могут быть фатальные последствия при вызове SETRESULTSET() из фокса, а не из ADO?
31 дек 09, 20:27    [8141903]     Ответить | Цитировать Сообщить модератору
 Re: Возврат SQL курсора из ХП  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
Zmej
А какие могут быть фатальные последствия при вызове SETRESULTSET() из фокса, а не из ADO?


Никаких, за исключением если return из ХП не используется в бизнес логике.

В принципе, как вариант можно попробовать написать ХП с SETRESULTSET() в которой внутри вызвать фоксовую ХП, надо проверять.
31 дек 09, 20:51    [8141938]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить