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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хранение SQL выражений 
:(
    Опции темы
gambit
Дата 16.8.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

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



Цитата(IGV @  16.8.2010,  10:53 Найти цитируемый пост)
скажите, а вы хотели бы покупая, скажем машину, видеть как у нее в цилиндрах поршни двигаются?

как двигаются поршни нет, а вот как подходят провода и шланги, мне видеть не страшно.

Цитата(IGV @  16.8.2010,  10:53 Найти цитируемый пост)
Вариант с текстовым фалом принят. что ещё?

!=
Цитата(IGV @  13.8.2010,  17:23 Найти цитируемый пост)
а если у меня, а если на пример, у меня не приложения а dll плагин, я что вместе с плагином буду подсовывать некий файлик? а если файлика нет, то всё падает....это не правильно


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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(IGV @  13.8.2010,  13:07 Найти цитируемый пост)
Как в приложении лучше всего реализовать хранение SQL выражений?

наверно симпатично будут смотреться статические поля отдельного класса. 
PM MAIL   Вверх
IGV
Дата 16.8.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mrbrooks @  16.8.2010,  12:48 Найти цитируемый пост)
статические поля отдельного класса

собственно пока так и делаю, ничего лучше не придумал

есть ещё вариант с отдельным resx файлом.
PM MAIL ICQ   Вверх
mrbrooks
Дата 17.8.2010, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(IGV @  16.8.2010,  18:09 Найти цитируемый пост)
есть ещё вариант с отдельным resx файлом. 

можно поюзать app.config. правда строки придется шифровать. это не сложно и не думаю, что очень долго. правда все зависит от твоих запросов.
PM MAIL   Вверх
Любитель
Дата 17.8.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(mrbrooks @  17.8.2010,  07:38 Найти цитируемый пост)
можно поюзать app.config. правда строки придется шифровать. это не сложно и не думаю, что очень долго. правда все зависит от твоих запросов. 

Ну вот серьёзно - как мы вызываем какие-то запросы? Не создаём же дб-комманды каждый раз (непосредственно)?! Так или иначе, для нас это будет выглядить как dbContext.GetSomeEntities(param1, param2, param3). Следовательно напрашиваются два подхода: либо пишем методы и маппим их атрибутами, либо методы генерится чем-либо (второе, очевидно проще с точки зрения реалзиации, если не устраивают готовые решения). В первом случае запрос/имя хранимки очевидно будут параметрами атрибута (примеры: раз, два). Во втором - будет хранится в каком-то конфиге, а затем будет подставлено в код генератором. Всё.

Смысл хранить во внешнем конфиге можно придумать только один - у нас одну задачу могут решать несколько запросов и мы будем их переключать конфигом. Тем не менее тяжело назвать это удачным арихектурным решением (хотя универсального ответа нет - мало ли..).


--------------------
PM MAIL ICQ Skype   Вверх
mrbrooks
Дата 18.8.2010, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(Любитель @  17.8.2010,  23:41 Найти цитируемый пост)
Смысл хранить во внешнем конфиге можно придумать только один - у нас одну задачу могут решать несколько запросов и мы будем их переключать конфигом. Тем не менее тяжело назвать это удачным арихектурным решением (хотя универсального ответа нет - мало ли..).


конфиг я предложил только из-за 
Цитата(IGV @  16.8.2010,  18:09 Найти цитируемый пост)
есть ещё вариант с отдельным resx файлом. 

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

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

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


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

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



Так, стоп. Давайте разберемся, кто тупит.
Топик стартер задал вопрос про хранение sql процедур. Хранить их естественно надо в классе ресурсов (и это не обязательно resx, это может быть любой класс), но из строк:

Цитата(IGV @  13.8.2010,  12:07 Найти цитируемый пост)
В приложении есть много SQL выражений. Они просто прописаны строковыми литералами.

Цитата(IGV @  13.8.2010,  12:07 Найти цитируемый пост)
т.к. запросы должны быть скрыты от "злоумышленника" 

Я пришел к выводу, о паранои ТС, и к тому, что он пытается скрыться от рефлектора и пр.

Если моя исходная теория верна, то ТС, что то сдулся фразой:

Цитата(IGV @  16.8.2010,  17:09 Найти цитируемый пост)
Цитата(mrbrooks @  16.8.2010,  12:48 )
статические поля отдельного класса

собственно пока так и делаю, ничего лучше не придумал
есть ещё вариант с отдельным resx файлом. 

Собирался скрываться, и тут бах решил все таки выложить. Если же, скрываться от рефлектора небыло желания, то мои фразы в стиле:

Цитата(gambit @  13.8.2010,  15:55 Найти цитируемый пост)
Но если уж совсем параноя, то шифруйте файл с ресурсами.

естественно бред. Но тогда не понятно вообще в чем вопрос, какая разница, где внутри программы хранить их код? Каждый решает сам. Лично я обычно стараюсь на слое с бизнес логикой, сделать некий класс, в котором содержаться методы работы с базой, например:
Код

public int GetId(string name)
        {
            using (SqlConnection conStr = new SqlConnection("строка подключения, берется из настроек, базового проекта"))
            {
                SqlCommand com = new SqlCommand();
                com.Connection = conStr;
                com.CommandText = "ReturnIdSUser"; // имя хранимки
                com.CommandType = CommandType.StoredProcedure;
                com.Parameters.AddWithValue("@name", name);
                var res = new SqlParameter();
                res.Direction = ParameterDirection.Output;
                res.ParameterName = "@idUser";
                res.SqlDbType = SqlDbType.Int;
                res.Size = 4;
                com.Parameters.Add(res);
                conStr.Open();
                com.ExecuteScalar();
                return int.Parse(res.Value.ToString());
            }
        }

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


Шустрый
*


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

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



я слово злоумышленник не просто так взял в кавычки, типичное недопонимание. Это был сарказм.
Скрываться от рефлектора желания не было.
Цитата(gambit @  18.8.2010,  11:30 Найти цитируемый пост)
Но тогда не понятно вообще в чем вопрос

хотелось узнать кто как делает, может услышать дельные советы на эту тему.
Цитата(gambit @  18.8.2010,  11:30 Найти цитируемый пост)
Лично я обычно стараюсь на слое с бизнес логикой, сделать некий класс, в котором содержаться методы работы с базой

вариант принят.



Это сообщение отредактировал(а) IGV - 18.8.2010, 14:38
PM MAIL ICQ   Вверх
Любитель
Дата 18.8.2010, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(gambit @  18.8.2010,  11:30 Найти цитируемый пост)
Лично я обычно стараюсь на слое с бизнес логикой, сделать некий класс, в котором содержаться методы работы с базой, например:

Ну, с точки зрения классических абстракшен лейеров - это неверно. Слой бизнес-догики должен думать о бизнес-сущностях. О том, как посылать команды, работать с базной конекцией и т. д. "думает" слой доступа к данным (data access layer).


--------------------
PM MAIL ICQ Skype   Вверх
gambit
Дата 19.8.2010, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

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



Любитель, согласен. Честно, вчера написал, перечитал - отправил. Сейчас прочитал твой топик, понял что написал бред. Хотя сделано верно, видимо путаюсь в терминалогии((((
PM MAIL ICQ Skype   Вверх
ДобренькийПапаша
Дата 21.8.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Я использовал тупо хранимки и написал оболочку для вызовов хранимок вот так:
Код

enum QueryType
    {
        ExecuteReader,
        ExecuteNonQuery,
        ExecuteScalar
    } 
    static class ProcInvoke
    {
        public static string ServerPath;
        public static string DataBasePath;
        public static string Login;

        private static SqlConnection GetDBConnection(string source, string initCat)
        {
            var cnStr = new SqlConnectionStringBuilder();
            cnStr.IntegratedSecurity = true;
            cnStr.DataSource = source;
            cnStr.InitialCatalog = initCat;

            var cn = new SqlConnection();
            cn.ConnectionString = cnStr.ConnectionString;
            return cn;
        }
        private static SqlParameter[] GetParameter(params ProcParams[] ex)
        {
            SqlParameter[] sqlParameters=new SqlParameter[ex.Length];
            sqlParameters.Initialize();
            
            for (int i = 0; i < ex.Length; i++)
            {
                sqlParameters[i].ParameterName = ex[i].ParamName;
                sqlParameters[i].SqlDbType = ex[i].DbType;
                if (ex[i].Size != 0)
                {
                    sqlParameters[i].Size = ex[i].Size;
                }
                if (ex[i].Value != null)
                {
                    sqlParameters[i].Value = ex[i].Value;
                }
                sqlParameters[i].Direction = ex[i].Direction;
            }
            return sqlParameters;
        }

        public static object ExecuteQuery(string procName, QueryType queryType, 
            CommandType cmdType, params ProcParams[] ex)
        {
           SqlConnection curConnect = GetDBConnection(ServerPath, DataBasePath);
           try
           {
                curConnect.Open();

                SqlCommand curCommand = new SqlCommand(procName, curConnect);
                curCommand.CommandType = cmdType;

                if (ex != null)
                {
                    curCommand.Parameters.AddRange(GetParameter(ex));
                }
                #region switch QueryType
                switch (queryType)
                {
                    case QueryType.ExecuteReader:
                        {
                            SqlDataReader curReader = curCommand.ExecuteReader();
                            return curReader;
                        }
                    case QueryType.ExecuteNonQuery:
                        {
                            curCommand.ExecuteNonQuery();
                            curConnect.Close();
                            return curCommand;
                        }
                    case QueryType.ExecuteScalar:
                        {
                            foreach(ProcParams cur in ex)
                            {
                                if (cur.Direction == ParameterDirection.Output)
                                {
                                    curCommand.ExecuteScalar();
                                    curConnect.Close();
                                    return curCommand;
                                }
                            }
                            object tmpObj = curCommand.ExecuteScalar();
                            curConnect.Close();
                            return tmpObj;
                        }
                    default:
                        {
                            MessageBox.Show("Неизвестный тип запроса", "Ошибка запроса",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                            curConnect.Close();
                            return null;
                        }
                }
                #endregion
            }
            catch(SqlException curEx)
            {
                //if(curEx.ErrorCode)
                MessageBox.Show(curEx.Message, curEx.Source);
                return null;
            }
        
        }
        
    }
    class ProcParams
    {
        private readonly string paramName;
        private readonly SqlDbType dbType;
        private readonly int size;
        private readonly Object value;
        private readonly ParameterDirection direction;

        public ProcParams(string parameterName, SqlDbType dbType,
                                                int size, Object value, ParameterDirection direction)
        {
            this.paramName = parameterName;
            this.dbType = dbType;
            this.size = size;
            this.value = value;
            this.direction = direction;
        }

        public string ParamName
        {
            get { return paramName; }
        }
        public int Size
        {
            get { return size; }
        }
        public object Value
        {
            get { return value; }
        }
        public SqlDbType DbType
        {
            get { return dbType; }
        }
        public ParameterDirection Direction
        {
            get { return direction; }
        }
    }


Вызовы выглядят так (тут есть недостаток в приведении к SqlDataReader), для меня это удобно было:
Код

using (SqlDataReader myReaderForFaculties = 
                                (SqlDataReader)ProcInvoke.ExecuteQuery("GetCathedralsOnFacs",QueryType.ExecuteReader,
                                                                        CommandType.StoredProcedure,
                                                                        new ProcParams("@FacFullName",
                                                                                        SqlDbType.VarChar, 50,cur.Text,
                                                                                        ParameterDirection.Input)))



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
mrbrooks
Дата 23.8.2010, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



ДобренькийПапаша, одно но - не все БД поддерживают хранимые процедуры  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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