Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не знаю как назвать эту тему, ибо не знаю о чем спрашиваю

408
08 октября 2008 года
Lei fang
265 / / 01.10.2005
Здравствуйте, вопрос конечно странный и я не знаю как его описать.
В вижуал с++ есть возможность создать функцию вида:
bool Execute(const char* QueryString, ...);
и вызывать ее так:
Execute("UPDATE auctions SET bidder = %u WHERE auctionId = %u", HighestBidder, Id);
т.е. то что в объявлении было как ... туда можно передать сколь угодно параметров HighestBidder, Id.
Я не знаю как называется такое явление.
В общем вопрос, можно ли сделать так в си шарп? Пробовал
 
Код:
public SqlDataReader ExecuteQuery(string QueryString, ...)
        {
   
        }

Не катит, пишет что "Type expected" и указывает на многоточие после запятой
5
08 октября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Lei fang

В общем вопрос, можно ли сделать так в си шарп? Пробовал
 
Код:
public SqlDataReader ExecuteQuery(string QueryString, ...)
        {
   
        }
Не катит, пишет что "Type expected" и указывает на многоточие после запятой


 
Код:
public SqlDataReader ExecuteQuery(string QueryString, params object[] args)
        {
   
        }

Правда вам придется как-то форматировать каждый элемент массива args в запрос.


Я кстати делал универсальный механизм (типобезопасный!) для выполнения хранимых процедур и запросов с параметрами.
Если заинтересует - пишите в ПМ или аську.
408
08 октября 2008 года
Lei fang
265 / / 01.10.2005
Круто, ошибок нет по крайней мере. Ты просто всезнающий человек видимо :) Жаль что не могу добавить тебе еще репутации, если она важна. Благодарю
5
08 октября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Lei fang
Только еще несколько вопросов возникло, а верно ли что я указал тип string для запроса


Зависит от того, как вы хотите работать с БД. Вообще, передача строки с подстановкой параметров запроса хреновый способ. Прямой путь к атакам типа SQL инъекций.

Цитата: Lei fang
Не будет проблем с подстановкой переменных на место форматных спецификаторов или надо использофать массив символов?

Есть в классе System.String функция Format. Умеет подставлять в строку значение, тоже кстати использует приведенный способ:

 
Код:
string formated_str = string.Format("This is simple integer: {0}, and that is quoted string: '{1}'", 10, "Hi!")
Цитата: Lei fang
и все таки как называется такое являние? :)

Это называется метод с переменным числом параметров.
Компилятор просто создает массив из передаваемых объектов, тогда как в C/C++ имеет место прелопачивание стека во время исполнения таких функций.
Кстати говоря, тип параметров можно контроллировать: object в объявлении позволит запихивать какие угодно данные (это супертип для всех типов в .NET), string - позволит передавать строки, а MyObject - только экземпляры твоих MyObject объектов.

408
08 октября 2008 года
Lei fang
265 / / 01.10.2005
ага, способ хреновый, зато гибкий... Я вообще хочу сделать все с помощью хранимых процедур, но таблиц такое множество, что я просто не могу сейчас сразу догадаться какие процедуры понадобятся, поэтому пока пишу обычными запросами (так перед тем как писать код мне не надо заморачиваться с новой хранимой процедурой), а потом сделаю из них хранимые процедуры.

Спасибо что указал на метод Format, я то уж подумал вручную прийдется заменять :)

На счет универсального механизма, я не совсем понимаю что это такое, какие преимущества и прочее. Просто хватать все что предлагают не считаю правильным, что сделаю сам то и сделаю :)
5
08 октября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Lei fang
На счет универсального механизма, я не совсем понимаю что это такое, какие преимущества и прочее. Просто хватать все что предлагают не считаю правильным, что сделаю сам то и сделаю :)


Механизм такой. Пример кода:

Код:
public abstract class MembershipDataAccess : CoreDataAccessBase {
...
        [StoredProcedure("sdo_membership_CreateGroup")]
        public abstract GroupEntry CreateGroup(Guid? parent_id, [StringValidator(1, 256)] string group_name);

        [StoredProcedure("sdo_membership_DeleteGroup")]
        public abstract void DeleteGroup(Guid group_id);

        [StoredProcedure("sdo_membership_GetGroups")]
        public abstract ICollection<GroupEntry> GetGroups(Guid? parent_id);
...
    }

Описывается абстрактный класс, в котором объявляются абстрактные методы, соответствующие хранимым процедурам или конкретным запросам. В последнем случае вместо атрибута StoredProcedureAttribute указывается SqlAttribute с текстом запроса.
Специальный кодогенератор (в рантайме) выполняет наследование этого класса и реализует все такие методы (создает DbCommand и подставляет ему параметры!). Параметры метода ставятся в соответствие параметрам запроса/хранимки. Поддерживаются, кажется, все стандартные типы данных: различной длины и знаковости целые числа, вещественные числа, строки, гуиды, также есть интеграция с Nullable<T> (в примере Guid?), что позволяет передавать в СУБД Null значения.

Всего есть три типа вызовов:
1) вызов без результата - ExecuteNonQuery (для вставки, обновления, или хранимка просто ничо не вертает),
2) вызов с возвратом единственной строки
3) вызов с возвратом набора строк (ICollection<T>)

Результаты вызовов заворачиваются в специальные классы (GroupEntry в примере), которые мы также определяем сами. Каждый класс содержит набор свойств, которые мы ставим в соответствие некоторому столбцу в результирующем наборе (также посредством атрибута).

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


Вообще похожая технология вызова хранимок ипользуется сейчас в LINQ (честно! я независимо от микрософта эту хрень разработал), но там каждый раз при вызове происходит отражение по методу.

В любом случае, рекомендую попробовать LINQ - это позволит резко поднять производительность труда программиста при работе с СУБД.
408
10 октября 2008 года
Lei fang
265 / / 01.10.2005
Хм, интересная вещь, но не думаю что в моем случае я не смогу ее использовать. у меня просто единичные запросы и не надо ничего кешировать :) Еще раз благодарю за помощь
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог