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

Откуда: Самара
Сообщений: 209
Ой, разрешите еще раз обратиться.
Наконец-то отладила код для процедуры. Ошибок нет, но...
Когда после выполнения процедуры пытаюсь вывести на экран выходной параметр, ничего не отображается..
Посмотрите пожалуйста... Может подскажите?
 <%Set  cmdProc= Server.CreateObject("ADODB.Command")

cmdProc.CommandText = "gruListplant"
cmdProc.CommandType = 4

Set prmIn = cmdProc.CreateParameter("@LIST", 200,1,70)
cmdProc.Parameters.Append prmIn
prmIn.Value = per

Set prmOut1 = cmdProc.CreateParameter("@NAME",200 ,1,100)
cmdProc.Parameters.Append prmOut1
prmOut1.Value = ""

Set cmdProc.ActiveConnection = OBJdbConnection
Set rstProc = cmdProc.Execute%>
p1=<%=prmout1%>
18 ноя 02, 09:30    [77586]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Это особенность ADO :)
Не отдает output-параметр если есть recordset.
Если заменить
Set rstProc = cmdProc.Execute

на
cmdProc.Execute

то должен отдавать
18 ноя 02, 09:43    [77592]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Chicago
Member

Откуда: Yekaterinburg
Сообщений: 750
У вас так (Direction = 1, adParamInput)

Set prmOut1 = cmdProc.CreateParameter("@NAME",200 ,1,100)


Нужно так (Direction = 3, adParamInputOutput)

Set prmOut1 = cmdProc.CreateParameter("@NAME",200 ,3,100)
18 ноя 02, 09:45    [77596]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Inebs
Member

Откуда: Самара
Сообщений: 209
Кажется работет. Но замена 1 на 3 не помогла почему-то.
А вот когда убраза рекордсет, и стаила просто Execute то работает! Странно....
Спасибо!!!!!
18 ноя 02, 09:58    [77606]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Chicago
Member

Откуда: Yekaterinburg
Сообщений: 750
2Trong:

Нет такой особенности. Сейчас проверил: при корректно выставленном значении свойства Direction команды ADO все значения выходных параметров отдаются назад корректно (MS SQL 7.0/2000 - оба проверял, MDAC 2.6, VB6) вне зависимости от наличия Recordset.
18 ноя 02, 10:00    [77609]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
MS SQL Server 2000
MDAC 2.5

cmdProc.Parameters.Append cmdProc.CreateParameter("@Id", adInteger, adParamInputOutput)

cmdProc.Parameters.Append cmdProc.CreateParameter("@Id", adInteger, adParamOutput)

Direction укзан? А вот не работает ...
18 ноя 02, 10:10    [77618]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Chicago
Member

Откуда: Yekaterinburg
Сообщений: 750
Я тут еще поэкспериментировал. Расположение курсора имеет значение.

Вот так работает

Private Sub Command1_Click()

Dim Cn As New ADODB.Connection
Cn.CursorLocation = adUseClient
Cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bla;Data Source=bla;Connect Timeout=60"
Cn.Open

Dim Cmd As New ADODB.Command

Cmd.CommandText = "zz_test_001"
Cmd.CommandType = adCmdStoredProc

Cmd.Parameters.Append Cmd.CreateParameter("@rc", adInteger, adParamInputOutput)
Cmd![@rc] = 0
Set Cmd.ActiveConnection = Cn

Dim rs As New ADODB.Recordset
Set rs = Cmd.Execute

MsgBox Cmd.Parameters("@rc")
End Sub


Комментируем вторую строчку, где CursorLocation. Не работает. :-)

Private Sub Command1_Click()

Dim Cn As New ADODB.Connection
'Cn.CursorLocation = adUseClient
Cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bla;Data Source=bla;Connect Timeout=60"
Cn.Open

Dim Cmd As New ADODB.Command

Cmd.CommandText = "zz_test_001"
Cmd.CommandType = adCmdStoredProc

Cmd.Parameters.Append Cmd.CreateParameter("@rc", adInteger, adParamInputOutput)
Cmd![@rc] = 0
Set Cmd.ActiveConnection = Cn

Dim rs As New ADODB.Recordset
Set rs = Cmd.Execute

MsgBox Cmd.Parameters("@rc")
End Sub
18 ноя 02, 10:17    [77623]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Inebs
Member

Откуда: Самара
Сообщений: 209
можно поинтересоваться? А какие курсоры надо указывать, когда открываешь рекордсет?
Например, я переданный параметр использую в качестве источник к рекордсету.
Set rsKat = Server.CreateObject("ADODB.Recordset")

rsKat.Open prmOut2 ,OBJdbConnection,1,3

3 =adLockOptimistic
1= adOpenKeyset. Правильно? (я спрашиваю, т.к. у меня есть "страсть" к нерабочим программам... :( )
18 ноя 02, 10:25    [77630]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
2Chicago: угу :) тока я не вижу смысла создавать курсор на клиенте.

2Inebs: вполне нормально.
Можно даже так:
rsKat.Open  prmOut2
18 ноя 02, 10:53    [77649]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Inebs
Member

Откуда: Самара
Сообщений: 209
Тогда почему же, опять у меня та же дурацкая ошибка? он что, prmout2 не понимает? :(((((
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another
18 ноя 02, 10:58    [77651]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Напиши сюда заголовок хранимой процедуры и получишь работающий код на вызов.

Например:

cretae procedure Test
@id int, @tst int = NULL output
as ... дальше не интересует
18 ноя 02, 11:03    [77655]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Inebs
Member

Откуда: Самара
Сообщений: 209
Вызывает процедуру он верно,и параметры возвращает.
Вот только у меня параметр @SQLKat, например представляет из себя строку - запрос, который я потом вставляю в источник рекордсета. И вот на ту строку , где я пишу
Set rsKat = Server.CreateObject("ADODB.Recordset")

rsKat.Open prmOut2 ,OBJdbConnection

он пишет мне ошибку.
А вызов поцедуры таков: Но эта часть с помощью "жителей" этого форму работает.... Пишу на всякий случай....
CREATE PROCEDURE gruListplant 	@LIST  VARCHAR(70), @NAME VARCHAR(2000) output, @SQLKat VARCHAR (2000) output,

@SQLMark VARCHAR(2000) output,@ST VARCHAR (1000) output
AS...
18 ноя 02, 11:33    [77673]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Chicago
Member

Откуда: Yekaterinburg
Сообщений: 750
2Inebs

А prmOut2 это что? Command, строка с текстом запроса, или параметр команды, как это следует из имени?

Первые 2 варианта гарантированно работают. Последний - изврат.
Но в случае команды объект должен быть создан, все входные параметры должны иметь значения, если соединение в команде установлено, то второй параметр в Recordset.Open можно опустить.

2Trong

Смысл создавать курсор на клиенте: если речь не идет об ASP, рано или поздно возникает необходимость вывести набор записей на экран в гриде. А грид, в частности Apex TDBGrid, server-side курсоры не обслуживает (сообщение об ошибке как всегда маловразумительное, в первый раз с этим можно долго рубиться :-).
18 ноя 02, 11:41    [77680]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Во-первых (ИМХО):
CREATE PROCEDURE gruListplant

@LIST VARCHAR(70),
@NAME VARCHAR(2000) = NULL output,
@SQLKat VARCHAR (2000) = NULL output,
@SQLMark VARCHAR(2000) = NULL output,
@ST VARCHAR (1000) = NULL output
AS...


а получение output-параметров так:

Set conn = Server.CreateObject("ADODB.Connection")

Set cmdProc = Server.CreateObject("ADODB.Command")
conn.Open "Provider=..."
Set cmdProc.ActiveConnection = conn

cmdProc.CommandText = "{? = call gruListplant(?,?,?,?,?)}"
cmdProc.Parameters.Append cmdProc.CreateParameter("Return", adInteger, adParamReturnValue)
cmdProc.Parameters.Append cmdProc.CreateParameter("@LIST", adVarchar, adParamInput, 70)
cmdProc("@LIST") = "1;2;3;"

cmdProc.Execute

Name = cmdProc("@NAME")
SQLKat = cmdProc("@SQLKat")
SQLMark = cmdProc("@SQLMark")
ST = cmdProc("@ST")
18 ноя 02, 11:42    [77681]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Inebs
Member

Откуда: Самара
Сообщений: 209
Извините, не совсем верно не писала.
CREATE PROCEDURE gruListplant 	@LIST  VARCHAR(70), @NAME VARCHAR(2000) output, @SQLKat VARCHAR (2000) output, @SQLMark VARCHAR(2000) output,@ST VARCHAR (1000) output

AS

НА asp
  Set  cmdProc= Server.CreateObject("ADODB.Command")

cmdProc.CommandText = "gruListplant"
cmdProc.CommandType = 4
Set prmIn = cmdProc.CreateParameter("@LIST", 200,1,70)
cmdProc.Parameters.Append prmIn
prmIn.Value = per
Set prmOut1 = cmdProc.CreateParameter("@NAME",200 , 3 ,2000)
cmdProc.Parameters.Append prmOut1
prmOut1.Value = ''
Set prmOut2 = cmdProc.CreateParameter("@SQLKat",200 , 3,2000)
cmdProc.Parameters.Append prmOut2
prmOut2.Value = ''
Set prmOut3 = cmdProc.CreateParameter("@SQLMark",200 ,3,2000)
cmdProc.Parameters.Append prmOut3
prmOut3.Value = ''
Set prmOut4 = cmdProc.CreateParameter("@ST",200,3,200)
cmdProc.Parameters.Append prmOut4
prmOut4.Value = ''

Set cmdProc.ActiveConnection = OBJdbConnection
cmdProc.Execute
Это все работает А вот дальше:
Set rsKat = Server.CreateObject("ADODB.Recordset")

rsKat.Open prmOut2
Орет ошибку...
18 ноя 02, 12:14    [77708]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Chicago
Member

Откуда: Yekaterinburg
Сообщений: 750
Ну вот, prmOut2 оказался параметром.

Set rsKat = Server.CreateObject("ADODB.Recordset")

rsKat.Open prmOut2


Так что правильно орет на ошибку.

Лучше напишите как Trong советовал чуть выше. Все что после cmdProc.Execute.


' Здесь ваш код до следующей строки включительно
cmdProc.Execute
Name = cmdProc("@NAME")
SQLKat = cmdProc("@SQLKat")
SQLMark = cmdProc("@SQLMark")
ST = cmdProc("@ST")


На все, что перед cmdProc.Execute, в его примере не обращайте внимания. Ничего не имею против его варианта, он рабочий, просто у вас до этого места все работает и не нужно менять шило на мыло.
18 ноя 02, 12:30    [77722]     Ответить | Цитировать Сообщить модератору
 СПАСИБО! ! !  [new]
Inebs
Member

Откуда: Самара
Сообщений: 209
Ну, наконец-то все работает! ! !
Большое Вам спасибо!
18 ноя 02, 13:02    [77751]     Ответить | Цитировать Сообщить модератору
 Re: Ошибку не выдает , но также не работает :(((  [new]
Коляныч
Member

Откуда:
Сообщений: 279
Chicago
>Я тут еще поэкспериментировал. Расположение курсора имеет значение.

как выяснилось - решающее значение. Полдня трахался, чтобы найти в чём причина, пока не нашёл вот что:

PRB: SQL Server Returns Output Parameters Only After Resultsets
Q256234

When stored procedures (SP) are executing in Microsoft SQL Server, output parameters are returned only after all of the resultsets have been completely fetched to the client. Attempts that are made to read output parameters prior to a full fetch of all resultsets do not return data...

ну и т.д. решается установкой расположения курора cursorLocation в adUseClient. Это всем, кому требуется возвращать и рекордсеты, и output параметры
27 мар 03, 14:16    [158044]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить