Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Возврат SQL курсора из ХП / 15 сообщений из 15, страница 1 из 1
23.12.2009, 22:44
    #36383367
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
Стыдно признаться, но вот незнаю как в хранимой процедуре указать, чтобы она вернула не одно скалярное значение, а результирующий курсор (от команды SQL). В хелпе по RETURN ничего такого не написано. Вариант CURSORTOXML не пойдет. Принимающая сторона не умеет работать с XML (или незнаю, что она это умеет).

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

Может кто наставит на путь истинный.
...
Рейтинг: 0 / 0
24.12.2009, 11:46
    #36384068
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
Для FoxPro таблица - это не переменная. Поэтому работать с ней как с переменной - невозможно. Т.е. через Return вернуть таблицу невозможно "по определению".

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

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

2. В ХП сделать Select-SQL, но результат выборки сохранить в курсоре (SELECT ... INTO CURSOR ...), а затем следующей командой сделать выборку из этого курсора. Возможно, это можно организовать одним пакетом (одной командой ADO). Возможно, через RETURN возвращать имя курсора, если ХП отработала успешно.
...
Рейтинг: 0 / 0
24.12.2009, 20:12
    #36385445
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
ВладимирМ,

Спасибо, Владимир, что откликнулись. Второй вариант мне приходил в голову, но смутил его "неказистый" вид.
Тем не менее, еще раз спасибо. Будут рыть.
...
Рейтинг: 0 / 0
25.12.2009, 14:31
    #36386593
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
Видать, придётся оставить эту затею, не возвращается в AORecordSet фоксовский курсор через ХП или ф-ию.
...
Рейтинг: 0 / 0
25.12.2009, 15:44
    #36386834
Ffffffffffffffff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
Через Курсорадаптер нельзя?
Не совсем понимаю задачу.
...
Рейтинг: 0 / 0
25.12.2009, 22:19
    #36387513
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
FfffffffffffffffЧерез Курсорадаптер нельзя?
Не совсем понимаю задачу.

Автор из JScript`через ADO хочет вызвать фоксовую ХП, которая формирует какой-то курсор и этим вызовом наполнить ADORecordSet, НО фоксовая ХП возвращает, что что написно в return (те теоретически можно извернуться, что бы наполнить рекордсет, но это будет извратом, либо я не знаю какого то пути)
...
Рейтинг: 0 / 0
29.12.2009, 23:37
    #36393006
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
Итак !
Немного помучавшись получил такой результат:
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 строки и числа обрабатываются нормально. Никто незнает чё за борода ?
...
Рейтинг: 0 / 0
29.12.2009, 23:44
    #36393014
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
Забыл код в ХП привести

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 символов.
...
Рейтинг: 0 / 0
30.12.2009, 12:17
    #36393539
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
Под термином "курсор" или "временная таблица" в FoxPro понимается таблица, полученная примерно так

Код: plaintext
SELECT ... INTO CURSOR (m.aliasname) NOFILTER

или так

Код: plaintext
1.
2.
CREATE CURSOR (m.aliasname) (Field1 C( 10 ), Field2 D, ...)
INSERT INTO (m.aliasname) SELECT ... FROM

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

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

Насчет типа данных Date - это зависит от того, понимает ли та среда, в которой Вы читаете RecordSet подобный тип данных. Т.е. дату без времени. Не все среды программирования имеют подобный тип данных.
...
Рейтинг: 0 / 0
30.12.2009, 12:43
    #36393622
Zmej
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
PaulWistВидать, придётся оставить эту затею, не возвращается в AORecordSet фоксовский курсор через ХП или ф-ию.
А никто не пробовал использовать функцию:
SETRESULTSET( nWorkArea | cTableAlias )
Вроде для этих целей предназначена, но никогда ею сам не пользовался...
...
Рейтинг: 0 / 0
30.12.2009, 20:43
    #36394595
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
Zmej,

Попробовал - работает !
Вот ведь ! А ларчик-то просто открывался !
Действительно: век живи - век учись.
Спасибо Zmej !
...
Рейтинг: 0 / 0
30.12.2009, 23:49
    #36394715
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
thunder2Zmej,

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

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

НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table.
...
Рейтинг: 0 / 0
31.12.2009, 18:10
    #36395287
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
PaulWist
НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table.
Достаточно добавить параметр в ХП и в зависимости от значения параметра использовать или не использовать SETRESULTSET()

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
FUNCTION sp_login(_name, _psw, _isResultSet)

(...)

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

return
ENDFUNC
...
Рейтинг: 0 / 0
31.12.2009, 20:27
    #36395327
Zmej
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
PaulWist
НО дело в том, что данная конструкция для фокса является "избыточной", те для фокса не надо таким образом возвращать курсор, поэтому "родные" ХП как правило в конце имеют просто return, соответственно Вам придётся писать клоны фоксовых ХП для возврата курсора, либо напрямую рисовать select * from table.
А какие могут быть фатальные последствия при вызове SETRESULTSET() из фокса, а не из ADO?
...
Рейтинг: 0 / 0
31.12.2009, 20:51
    #36395334
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат SQL курсора из ХП
ZmejА какие могут быть фатальные последствия при вызове SETRESULTSET() из фокса, а не из ADO?

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

В принципе, как вариант можно попробовать написать ХП с SETRESULTSET() в которой внутри вызвать фоксовую ХП, надо проверять.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Возврат SQL курсора из ХП / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]