none
Зачем нужны хранимые процедуры RRS feed

  • Вопрос

  • вот хранимая процедура

    CREATE PROCEDURE GetCustomerName
    @customerId int,
    @Name char(15) output
    AS
    SELECT @Name = Name from Customers where CustomerId = @customerId

    а вот так я его исплоьзую

    public string LookUpCustomerName(int CustomerID)
            {
                string carPetName = string.Empty;
                // Establish name of stored proc.
                using (SqlCommand cmd = new SqlCommand("GetCustomerName", this.sqlConnection))
                {
    
                    cmd.CommandType = CommandType.StoredProcedure;
                    // Input param.
                    SqlParameter param = new SqlParameter();
                    param.ParameterName = "@customerId";
                    param.SqlDbType = SqlDbType.Int;
                    param.Value = CustomerID;
                    // The default direction is in fact Input, but to be clear:
                    param.Direction = ParameterDirection.Input;
                    cmd.Parameters.Add(param);
                    // Output param.
                    param = new SqlParameter();
                    param.ParameterName = "@Name";
                    param.SqlDbType = SqlDbType.Char;
                    param.Size = 15;
                    param.Direction = ParameterDirection.Output;
                    cmd.Parameters.Add(param);
                    // Execute the stored proc.
                    cmd.ExecuteNonQuery();
                    // Return output param.
                    carPetName = (string)cmd.Parameters["@Name"].Value;
                }
                return carPetName;
            }

    ну а здесь нет никаких хранимых процедур. 

    public string GetCustomerName(int customerID)
            {
                string result = string.Empty;
                string sql = string.Format("Select * From Customers Where CustomerId = '{0}'", customerID);
                using (SqlCommand cmd = new SqlCommand(sql, this.sqlConnection))
                {
                    SqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                        result = (string)dr["Name"];
                    }
                    dr.Close();
                }
                return result;
            }

    Результат одинаковый, так зачем использовать Хранимые процедуры? Их ведь писать дольше.

    4 января 2014 г. 8:25

Ответы

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


    [Блог] [Twitter]

    • Помечено в качестве ответа Medet Tleukabiluly 4 января 2014 г. 12:21
    4 января 2014 г. 8:34
  • Кроме того, я не устану неоднакратно повторять, что это плохо и с точки зрения безопасности, особенно ели вы не используете параметризованные запросы, а собираете код SQL конкатенацией. Плюс, вынос кода  SQL из программы уменьшает связность. Позже вы можете изменить, оптимизировать код T-SQL независимо от приложения, не придётся его пересобирать.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Medet Tleukabiluly 4 января 2014 г. 12:21
    4 января 2014 г. 9:17
    Модератор

Все ответы

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


    [Блог] [Twitter]

    • Помечено в качестве ответа Medet Tleukabiluly 4 января 2014 г. 12:21
    4 января 2014 г. 8:34
  • Кроме того, я не устану неоднакратно повторять, что это плохо и с точки зрения безопасности, особенно ели вы не используете параметризованные запросы, а собираете код SQL конкатенацией. Плюс, вынос кода  SQL из программы уменьшает связность. Позже вы можете изменить, оптимизировать код T-SQL независимо от приложения, не придётся его пересобирать.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Medet Tleukabiluly 4 января 2014 г. 12:21
    4 января 2014 г. 9:17
    Модератор
  • Это касательно их использования в .NET (это лишь малая область их применения). Что касается кода T-SQL, то хранимые процедуры намного глобальное понятие. Они позволяют инкапсулировать определённый код в пакеты, для одновременного выполнения.

    Сделаем содержимое сообщества лучше, вместе!

    4 января 2014 г. 9:19
    Модератор
  • теперь надо учить T-Sql?

    или если знаете напишите мне такой вот метод> метод принимает string str1 и возвращает его hash а так же записывает это в таблицу userHashTable (где есть 2 колонки [customerId, hashValue])

    или можно ли как то C# конвертировать в T-Sql? ^_^


    4 января 2014 г. 11:05
  • В целом надо. Но вычислять хеш нужно в коде CLR, а потом уже передавать его в базу. Для этого T-SQL не нужен.

    Сделаем содержимое сообщества лучше, вместе!

    4 января 2014 г. 11:35
    Модератор
  • мне кажется он вообще не нужен. этот tsql, погуглил, это тема большая, очень. и ради пару хранимых процедур, такик как запись в hashtable думаю можно и принебречь правилами хорошего кода. тем более если я запакую всю работу с базой данных в отдельную dll (и никто не узнает как он там реализован). думаю я делаю все правильно. скажите мнение
    4 января 2014 г. 11:46
  • Ради пары может и не стоит. Но вот стараться придерживаться стандартов хорошего кодирования всё же нужно, не всегда же будете писать код который состоит из пары хранимок. Это вам на будущее.

    Сделаем содержимое сообщества лучше, вместе!

    4 января 2014 г. 12:17
    Модератор
  • спасибо
    4 января 2014 г. 12:21