[ASP][MSSQL] Проблема с вызовом хранимой процедуры
От: Adward Россия http://www.sprut.ru
Дата: 10.10.06 21:45
Оценка:
Доброго времени суток всем.

Вызываю хранимую процедуру из ASP:
var Conn = Server.CreateObject("ADODB.Connection");
    Conn.Mode = 3;
    Conn.Open("skynet" , "", "");
    
var FindRecordset = Server.CreateObject("ADODB.Recordset");
        
    Conn.FindUser (-1,null,null,'Пет',null,null,null, FindRecordset);    
    
    Response.Write("fields.Count = " + FindRecordset.fields.Count);
    Response.Write("<br>");
    Response.Write("RecordCount = " + FindRecordset.RecordCount);
    
FindRecordset.Close();        
Conn.Close();

Результатом выполнения является:
fields.Count = 5
RecordCount = -1

тоесть, понятно, у меня есть на MSSQL 2000 некая хранимая процедура FindUser, с семью входящими параметрами, если я выполняю её в query analiser — процедура честно пробегается по всем таблицам, и сделав своё дело возвращает таблицу из 5 столбцов и n-ного количества строк, но почему же она себя так плохо ведёт при вызове из ASP?
самое интересное, что возвращаемое количество столбцов истинное, количество строк не то, чтобы ноль, а минус один (!!!)

Пробовал этот способ:
var Conn = Server.CreateObject("ADODB.Connection");
    Conn.Mode = 3;
    Conn.Open("skynet" , "", "");
    
var testSql = "exec [dbo].[FindUser] -1,NULL,NULL,'Пет',NULL,NULL,NULL";
var rd = Conn.Execute (testSql);        
    Response.Write("fields.Count = " + rd.fields.Count);        
    Response.Write("<BR>RecordCount = " + rd.RecordCount );

Conn.Close();

Результат один-в-один...

Поиск по архиву форума мне ничего не дал почему-то...

Буду благодарен любым коментариям.
Re: [ASP][MSSQL] помогите плиз, до 5 утра досидел
От: Adward Россия http://www.sprut.ru
Дата: 11.10.06 01:18
Оценка:
В общем, приблизительно то я понял в какую сторону рыть, но дальше двигаться не могу, толи мозг не соображает, толи руки кривые.
Одним словом, перенёс приложеньице на клиента (чтобы отлаживать можно было), понял, что хранимую процедуру нужно вызывать немного иначе, код выглядит теперь так:

var cmd = new ActiveXObject("ADODB.Command");
var rs = new ActiveXObject("ADODB.Recordset");

cmd.ActiveConnection = "skynet";
cmd.CommandText = "FindUser";
cmd.CommandType =  4;//adCmdStoredProc;
cmd.CommandTimeout = 15;
    prm = cmd.CreateParameter("p_id_user", 3, 1, 1, -1);
    cmd.Parameters.Append(prm);    
    prm = cmd.CreateParameter("p_nophone", 129, 1, 100, "");
    cmd.Parameters.Append(prm);
    prm = cmd.CreateParameter("p_name", 129, 1, 50, "");
    cmd.Parameters.Append(prm);
    prm = cmd.CreateParameter("p_mname", 129, 1, 50, "");
    cmd.Parameters.Append(prm);
    prm = cmd.CreateParameter("p_lname", 129, 1, 50, "");
    cmd.Parameters.Append(prm);
    prm = cmd.CreateParameter("p_id_user", 3, 1, 1, -1);
    cmd.Parameters.Append(prm);
    prm = cmd.CreateParameter("p_id_user", 3, 1, 1, -1);
    cmd.Parameters.Append(prm);
    rs = cmd.Execute();
    
    alert(rs.RecordCount);  //Вот тут выходит ошибка Операция не допускается, если объект закрыт

Для общего понимания зачём все эти цифры — покажу как начинается ХП:

CREATE PROCEDURE FindUser
/*Поиск юзерофф*/

@p_id_user INT  = -1,
@p_nophone varchar(100) =  '',    -- Номер телефона
@p_name varchar(50) = '',         -- Имя
@p_mname varchar(50) = '',        -- Фамилия
@p_lname varchar(50) = '',        -- Отчество
@p_id_code_filials INT = -1,      -- ID Филиала/РП
@p_id_code_city INT = -1          -- ID Код города

AS

SELECT ....


Что делать, гуру? Куда дальше рыть?
Еле нашёл кстати такие ресурсы как ADO Objects and Interfaces, DataTypeEnum и ParameterDirectionEnum

Удивлюсь, если найду единомышленника, который хоть когда либо осиливал все эти вещи на JS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.