Вопрос

У меня есть идея, что использования SQL VIEWS для абстрагирования простых вычислений базы данных (например, подсчета отношения) достаточно, и вам не нужны процедуры (== процедурный код)

Простой sql вид + а где предложение >> иногда хранимая процедура с параметрами

Говоря об этом, я представил способ получения данных таблицы/представления без написания SQL и без написания предложенияwhere.

Но, к моему удивлению, в ADO.NET 2.0 или более поздних версиях, похоже, нет способа сделать это.

Позвольте мне рассказать вам, что я пробовал:

  • SqlDataAdapter + SqlCommandBuilder по-прежнему требует от вас написать «SELECT...ОТ" и ГДЕ СТАТЬЯ в строках (плюс, если вы укажете «где», вам не придется часто использовать Update/Insert/DeleteCommand)

  • Типизированные наборы данных позволяют получать только _все таблицы DataTable_ и затем применять к ним фильтры.Фильтры — это строки, не ускользающие от помощи...(необходимо удвоить одинарную кавычку!)

  • SQL для сущностей выглядел многообещающе, но, похоже, они:ограничиваться MSSQL, генерировать раздутые SQL-запросы, генерировать совершенно новый стек DAO (помимо существующих классов модели предметной области), требовать для всего этого .net 3.5+ и т. д.(то есть все это для меня минусы)

Другие ORM имеют те же проблемы, что и SQL для сущностей.

Я ищу строго типизированный метод доступа к таблицам базы данных/Просмотры что:

  • не поставляется с другим набором DAO (K.I.S.S)
  • позволяет мне запрашивать таблицу без написания «SELECT» в строках (строгая типизация)
  • позволяет мне фильтровать(ГДЕ) таблица с правильно экранированными параметрами (и без предварительного получения всех данных)
  • позже может выпускать обновления/вставки/удаления

Я новичок в .Net, но не глуп:это существует?

Спасибо.

Это было полезно?

Решение

Дозвуковой имеет довольно легкий вес инструмент запросов который вы можете использовать для прямого запроса к базе данных с помощью объекта Query, который абстрагирует SQL.Если вы хотите, вы также можете использовать его средство генерации кода для сопоставления таблиц базы данных с POCO или для создания только строго типизированной схемы (для имен столбцов/таблиц и т. д.).

Другие советы

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

Учтите, что C# — это язык общего назначения, и его компилятор совершенно не знает о типах ваших баз данных, поэтому вы не можете связать их без использования некоторого уровня абстракции, который обычно включает в себя специальные SQL-запросы (строки), NHibernate или аналогичные файлы сопоставления. (больше строк) и/или DAO.

Если вы не хотите писать предложение WHERE, один из способов — использовать объект Filter и добавить нужные условия.Например:

        var sc = new Filter();
        sc.Add("Contacttitle", "Sales Agent");
        sc.Add("city", "london", Logical.Or);
        var customers = D2Bk.Fetch(sc, new Customers());

Но вы не хотите использовать DAO (например, клиенты выше), поэтому вам придется написать оператор SQL и указать предложениеwhere:

        DataSet ds = D2Bk.Fetch("SELECT * FROM Customers WHERE Contacttitle=@PAR1 OR City=@PAR2", "Sales Agent", "london");

Я предполагаю, что вы посмотрели ЛИНК и Службы данных ADO.Net и они не соответствуют некоторым вашим требованиям?

Native ADO.Net является поставщиком базы данных и, следовательно, предоставляет прямой интерфейс SQL к базовым источникам данных.Существуют различные решения на основе CRUB, которые в разной степени имитируют то, что вы предлагаете.

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

Даже не могу поверить, что забыл добавить Платформа сущностей ADO.Net который используется, среди прочего, службами данных ADO.Net.Существует также поставщик LINQ to Entities.

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

Итак, я сделал что-то вроде этого:

CREATE PROCEDURE [GetSimpleCustomers]
(
@ID varchar(50) = null,
@Name varchar(50) = null,
@IsActive  bit = null,
@Address1 varchar(50) = null,
@Address2 varchar(50) = null,
@City varchar(50) = null,
@State varchar(50) = null,
@Zip varchar(50) = null
)
AS

SELECT ID, Name, IsActive, Address1, Address2, City, State, Zip
FROM SimpleCustomerExample
WHERE (ID = @ID OR @ID is NULL)
AND (Name = @Name OR @Name is NULL)
AND (IsActive = @IsActive or @IsActive is NULL)
AND (Address1= @Address1 or @Address1 is NULL)
AND (Address2= @Address2 or @Address2 is NULL)
AND (City= @City or @City is NULL)
AND (State= @State or @State is NULL)
AND (Zip= @Zip or @Zip is NULL)

Это позволит вам вызывать sproc в вашем коде и передавать только те параметры, которые вас интересуют для фильтрации, а остальные не будут учитываться, если вы оставите их нулевыми.

Итак, вы можете сделать что-то вроде

public List<SimpleCustomer> GetAllCustomersFromOhio()
{
    List<SimpleCustomer> list = new List<SimpleCustomer>();
    using (SqlCommand cmd = new SqlCommand(blah blah))
    {
        cmd.Parameters.AddWithValue("State", "Ohio");//or "OH" depending on your convention
        using(IDataReader oDR = cmd.ExecuteReader())
        {
             //hydrate your list of SimpleCustomers from the record set.
        }
    }
    return list;
}

РЕДАКТИРОВАТЬ:В ответ на комментарий:Вы можете достаточно легко изменить GetSimpleCustomers на DeleteSimpleCustomers, изменив

SELECT <columns> FROM SimpleCustomers

к

DELETE FROM SimpleCustomers 

и сохраняйте ту же логику.То же самое верно и для обновления.А еще я отвечу вопросом на вопрос:Сколько у вас таблиц, которым действительно требуется такой уровень пользовательской фильтрации?Синтаксис будет настолько похожим, что вы сможете разобраться во всем за день (или меньше, если вы соберете простой скрипт, который напишет его за вас).

Если вы используете строго типизированные наборы данных, вы можете создавать параметризованные запросы в редакторе Visual Studio, добавляя в запрос идентификаторы с префиксом @.Создайте XSD-файл набора данных в Visual Studio и создайте новую таблицу под названием Products, а затем добавьте к ней новый запрос.

Например:

select * from Products where Category = @category;

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

Недавно я написал «структуру» запроса для генерации предложений SQL.

Основным компонентом является класс BaseQueryArgs с функцией ToWhereClause(), которая использует отражение для преобразования свойств в разделы строк.Это необходимо для выполнения работы по экранированию и правильному форматированию значений.

Любой класс, наследующий BaseQueryArgs, просто должен объявить общедоступные свойства, и в итоге вы получите строго типизированный объект запроса.Для необязательных свойств вы устанавливаете значение, допускающее значение NULL (тип ссылки или Nullable<>), а генератор SQL отфильтровывает значения NULL.

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

  • имя пользовательского столбца, которое отличается от имени свойства
  • обработка настраиваемых значений (например, использование значения даты в качестве тестового выражения BETWEEN)

Это можно использовать для создания запросов со строго типизированным объектом запроса, например:

MyCustomQueryArgs args = new MyCustomQueryArgs
{
    ProductFamilyID = 17,
    Region = Regions.Northwest,
    Active = true
};

List<Product> product = QueryProcessor.GetProductsWhere(args);

GetProductsWhere(), очевидно, вызовет некоторый метод данных, который обращается к представлению с помощью сгенерированного SQL.

У меня нет решения для обновлений/удалений, но, похоже, не так сложно написать метод, который преобразует экземпляр объекта в оператор SQL с использованием переключателя или атрибута для определения имени таблицы.

Это очень «самостоятельно», но это дает вам свободу настраивать его под свои нужды и не требует большого количества тяжелой упаковки ORM/DAO.

Посмотри на Пейзажи разума продукты

Он создает строго типизированные модели запросов LINQ, что приводит к созданию эффективного кода SQL для различных механизмов баз данных и включает поддержку Memcached и Lucene.

Я использовал XPO в нескольких проектах, и их новая версия лучше поддерживает запросы.

http://www.devexpress.com/Products/NET/ORM/

Однако реализация, как и все они, не лишена недостатков.

я использую Аннотация данных для моих проектов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top