Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить параметр из ф-ции, Значение из БД передать в веб-часть 
:(
    Опции темы
D_EMO_N
  Дата 5.2.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 20.11.2007

Репутация: нет
Всего: нет



Подскажите как использовать ф-ции БД в C#.
Есть функция к-рая должна получать параметры и возвращать bit,
для того что-бы потом C# по 1 или 0 определял что ему делать дальше, но как это реализовать не понял, пробыва на разных примерах но ничего не выходит
Код

        public bool haveUserAcceessToOrganization(int nUserId, int nOrganizationId)
        {    
//            int access = 0;
            SqlCommand sqlCmd = new SqlCommand();
            AddParamToSQLCmd(sqlCmd, "@ReturnValue", SqlDbType.Int, 0, ParameterDirection.ReturnValue, null);
            AddParamToSQLCmd(sqlCmd, "@UserID", SqlDbType.Int, 0, ParameterDirection.Input, nUserId);
            AddParamToSQLCmd(sqlCmd, "@OrganizationID", SqlDbType.Int, 0, ParameterDirection.Input, nOrganizationId);
            SetCommandType(sqlCmd, CommandType.StoredProcedure, "haveUserAcceessToOrganization");
            ExecuteScalarCmd(sqlCmd);
            int returnValue = (int)sqlCmd.Parameters["@access"].Value;
            return (returnValue == 1 ? true : false);
        }


Код

        private void AddParamToSQLCmd(SqlCommand sqlCmd, string paramId, SqlDbType sqlType, int paramSize, ParameterDirection paramDirection, object paramvalue) 
                {
            // Validate Parameter Properties
            if (sqlCmd== null)
                throw (new ArgumentNullException("sqlCmd"));
            if (paramId == string.Empty)
                throw (new ArgumentOutOfRangeException("paramId"));

            // Add Parameter
            SqlParameter newSqlParam = new SqlParameter();
            newSqlParam.ParameterName= paramId;
            newSqlParam.SqlDbType = sqlType;
            newSqlParam.Direction = paramDirection;

            if (paramSize > 0)
                newSqlParam.Size=paramSize;

            if (paramvalue != null)
                newSqlParam.Value = paramvalue;

            sqlCmd.Parameters.Add (newSqlParam);
        }


не обрабатывает просто, возможно неправильный синтаксис и просто не может найти фцию из-за того что указан тип как у процедуры?(CommandType.StoredProcedure), но тогда как правильно, т.к. ХП не может возвращать параметры...вроде... 

Это сообщение отредактировал(а) D_EMO_N - 5.2.2008, 12:37
PM MAIL   Вверх
thomas
Дата 5.2.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



D_EMO_N, 
Приветствую.
ХП может возвращать параметры.
Посмотри документацию:

Электронная документация по SQL Server 2005  
CREATE PROCEDURE (Transact-SQL) 

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.ru/tsqlref9/html/afe3d86d-c9ab-44e4-b74d-4e3dbd9cc58c.htm

Добавлено через 4 минуты и 46 секунд
Вот пример ХП, которая вносит новую строку в таблицу БД и возвращает присвоенный этой строке id.
Ключевое слово OUTPUT
Код

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_Groep_Add]
    @groepNaam NVARCHAR(20),
    @groepId INT OUTPUT
AS
INSERT INTO tblGroep
    (
    GroepNaam
    )
VALUES
    (
    @groepNaam
    )
SELECT @groepId = SCOPE_IDENTITY()

Ты можешь задать возвращение того или иного параметра по тому или иному условию внутри ХП.
А в приложении принимать эти параметры и обрабатывать.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
D_EMO_N
Дата 5.2.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 20.11.2007

Репутация: нет
Всего: нет



У меня MS SQL 2000. Там OUTPUT, но он задается при комманде SELECT и выводит данный из таблицы,
а у меня случай когда из таблицы выбираются параметры, сравниваются, и возвращают параметр

Код

CREATE function login(@UserID int, @OrganizationID int)
returns int
as
begin
  declare @access bit
    set @access = 0;

...

  return @access;
end

PM MAIL   Вверх
thomas
Дата 5.2.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



D_EMO_N, 
Если я правильно понял, то тебе надо проверять есть ли в таблице БД запись с данным id пользователя и id организации. Так?

Решение простое. Пишешь простую ХП с инструкцией 
Код

SELECT COUNT(*) AS res FROM tblLogin WHERE userId = @UserID AND organizationID = @OrganizationID

соответсвенно такая ХП вернет 1, если такой пользователь есть, и соответственно 0, если такой строки в таблице нет.

Удачи.  smile 

Это сообщение отредактировал(а) thomas - 5.2.2008, 13:13


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
D_EMO_N
Дата 5.2.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 20.11.2007

Репутация: нет
Всего: нет



Спс, томас. Не, там намного тяжелее все.
Код

CREATE function haveUserAcceessToOrganization(@UserID int, @OrganizationID int)
returns int
as
begin
  declare @access bit
    set @access = 0;

    declare @exist int
    select @exist = count(*) 
    from Sec_users as se, Orgn_Institution as oi
    where (UserID = @UserID) and (se.OrganizationID=@OrganizationID)
    if (@exist>0) set @access = 1 --если пользователь зашел на своё учреждение - открыть доступ. К управлениям не относится


    declare @LIH int
    declare @RIH int
    select  @LIH=LeftIndex, @RIH=RightIndex 
    from Sec_Users as su left outer join Orgn_Branch as ob on
        su.OrganizationID = ob.OrganizationID
    where (su.UserID = @UserID)

    declare @LIR int
    declare @RIR int
    select  @LIR=LeftIndex, @RIR=RightIndex --это должен быть индекс управления или учрреждения(что-бы пользователь не зашел на соседнюю ветку
    from Orgn_Branch as ob left outer join Orgn_Institution as oi on
        oi.BranchID = ob.OrganizationID
    where (oi.OrganizationID = @OrganizationID)
        or ((oi.BranchID = @OrganizationID) and (ob.OrganizationID = @OrganizationID))

    if ((@LIH<=@LIR) and (@RIH>=@RIR)) set @access = 1 --если пользователь запрашивает свою или нижнюю организацию(управл\учрежд) из своей ветки то доступ разрешить

  return @access;
end


так что обыычным подсчтетом кол-ва строк тут нельзя обойтись.
PM MAIL   Вверх
thomas
Дата 5.2.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



D_EMO_N, 
Тогда ищи как в ХП выполнять твою функцию.
Потом из программы обрабатывай что вернет ХП. 1 или 0.

А вообще интересно как у тебя там построена иерархия доступа и как она отображена в таблицах БД.
Может есть вариант это дело организовать в одной таблице.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
1stain
Дата 5.2.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



ты же в первои примере получаешь то, что тебе надо, но сразу же теряешь:

Цитата

            SetCommandType(sqlCmd, CommandType.StoredProcedure, "haveUserAcceessToOrganization");
            ExecuteScalarCmd(sqlCmd);


попробуй так:
Код

            SetCommandType(sqlCmd, CommandType.StoredProcedure, "haveUserAcceessToOrganization");
            return (bool)ExecuteScalarCmd(sqlCmd);



Это сообщение отредактировал(а) 1stain - 5.2.2008, 16:36


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
D_EMO_N
Дата 5.2.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 20.11.2007

Репутация: нет
Всего: нет



все равно нет. при дебаге тупо выполняет эту строчку, а на следующюю не реагирует.
Даже если я там ошибочное напишу - 0 реакци. :(
т.е. строка             
Код
            int returnValue = (int)sqlCmd.Parameters["@access"].Value; 
не обрабатывается 
PM MAIL   Вверх
thomas
Дата 5.2.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



D_EMO_N, 
Приветствую.
Выше я приводил код самой ХП в БД, которая возвращает параметр(присвоенный строке id).
Теперь приведу код который работает с этой ХП в приложении.
Код

private static Groep AddEntity(Groep groep)
                {
                    int groepId = 0;
                    using (SqlConnection con = new SqlConnection(Common.connectionString))
                    {
                        string proc = "usp_Groep_Add";
                        using (SqlCommand cmd = new SqlCommand(proc, con))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@groepNaam", groep.GroepNaam);
                            cmd.Parameters.Add(new SqlParameter("@groepId", SqlDbType.Int));
                            cmd.Parameters["@groepId"].Direction = ParameterDirection.Output;
                            con.Open();
                            cmd.ExecuteNonQuery();
                            groepId = Convert.ToInt32(cmd.Parameters["@groepId"].Value);
                        }
                    }
                    groep = GetEntity(groepId);
                    return groep;
                }


Обрати внимание на эти две строки кода
Код

cmd.Parameters.Add(new SqlParameter("@groepId", SqlDbType.Int));
cmd.Parameters["@groepId"].Direction = ParameterDirection.Output;

Они определяют что должна вернуть процедура.
А дальше обрабатывается что же она вернула
Код

groepId = Convert.ToInt32(cmd.Parameters["@groepId"].Value);

А что у тебя? 
Код

// сначало это
AddParamToSQLCmd(sqlCmd, "@ReturnValue", SqlDbType.Int, 0, ParameterDirection.ReturnValue, null);
// а потом вот это
int returnValue = (int)sqlCmd.Parameters["@access"].Value;


Подумай еще раз.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
1stain
Дата 5.2.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



что-то меня терзают смутные сомнения... Что за метод ExecuteScalarCmd и не обрабатываются ли там исключения при выполнении?
Для вызова функций тип команды CommandType.StoredProcedure не ставится
Попробуй так:
Код

CREATE FUNCTION dbo.SampleFunction
(
    @UserID int,
    @OrganizationID int
)
RETURNS bit
AS
BEGIN
    DECLARE @access bit
    SET @access = 0
/*
    Тело функции
*/
    return @access
END


Код

            SqlConnection connection = new SqlConnection(connString);
            SqlCommand command = new SqlCommand();
            command.CommandType = System.Data.CommandType.Text;
            command.Parameters.AddWithValue("@UserID", 1);
            command.Parameters.AddWithValue("@OrganizationID", 1);
            command.CommandText = "SELECT dbo.SampleFunction(@UserID, @OrganizationID)";
            command.Connection = connection;
            connection.Open();
            try
            {
                Console.WriteLine((bool)command.ExecuteScalar());
            }
            finally
            {
                connection.Close();


з.ы. кстати, зачем писать свои обертки для стандартных методов?


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
thomas
Дата 6.2.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Цитата(1stain @ 5.2.2008,  21:19)

Для вызова функций тип команды CommandType.StoredProcedure не ставится

Меня с самого начала по этому поводу терзали смутные сомнения. 

До сего момента, я работал исключительно с sql-командами и с недавнего времени начал использовать Хранимые процедуры.
Про функции на сервере, скажем так, слышал, но толком не юзал.



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
D_EMO_N
Дата 6.2.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 20.11.2007

Репутация: нет
Всего: нет



Цитата(1stain @  5.2.2008,  23:19 Найти цитируемый пост)
 Что за метод ExecuteScalarCmd

Код

        private Object ExecuteScalarCmd(SqlCommand sqlCmd) {
            // Validate Command Properties
            if (ConnectionString == string.Empty)
                throw (new ArgumentOutOfRangeException("ConnectionString"));

            if (sqlCmd== null)
                throw (new ArgumentNullException("sqlCmd"));

            Object result = null;

            using (SqlConnection cn = new SqlConnection(this.ConnectionString))
                        {
                        sqlCmd.Connection = cn;
                        cn.Open();
                        result = sqlCmd.ExecuteScalar();
            }

            return result;
        }



Цитата(1stain @  5.2.2008,  23:19 Найти цитируемый пост)
.ы. кстати, зачем писать свои обертки для стандартных методов?

Потому что потом много раз будет использоваться этот метод, и что-бы не открывать новое подключение, т.к. пользователь уже залогинился в программу

PM MAIL   Вверх
thomas
Дата 6.2.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



D_EMO_N, 
Извиняюсь, может я чего то не допонимаю, но вот это
Цитата

Потому что потом много раз будет использоваться этот метод, и что-бы не открывать новое подключение, т.к. пользователь уже залогинился в программу

как то не вяжеться с этим
Код

using (SqlConnection cn = new SqlConnection(this.ConnectionString))
{
                        sqlCmd.Connection = cn;
                        cn.Open();
                        result = sqlCmd.ExecuteScalar();
}

Насколько я понимаю конструкция using предполагает автоматическое закрытие соединения и освобождение ресурсов. К тому же там используется слово new. Т.е. каждый раз создается новое соединение на основании connectionString.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
D_EMO_N
Дата 6.2.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 20.11.2007

Репутация: нет
Всего: нет



ой. я не то имел в виду. что-бы для каждого соединения не писать новую процедуру подключение, а не само подключение.
и вопрос вот такой, в дебаг режиме просто не обрабатывается строчка 18: return result \ это из ExecuteScalarCmd, может ошибка в том что SQL не правильно возвращает данные?
PM MAIL   Вверх
thomas
Дата 6.2.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



D_EMO_N, 
А строчка 15
Код

result = sqlCmd.ExecuteScalar();

что дает?

Добавлено через 1 минуту и 31 секунду
Цитата

может ошибка в том что SQL не правильно возвращает данные? 

Если установлена management studio, то попробуй выполнить свой запрос там и посмотри что он вернет.



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.