ASP.NET - хранение запросов SQL в файле глобальных ресурсов? - PullRequest
4 голосов
/ 07 ноября 2008

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

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

Ответы [ 5 ]

7 голосов
/ 07 ноября 2008

Файлы ресурсов обычно используются для локализации. Но строка - это просто строка, это просто строка, и вы действительно хотите отправить любую старую строку в файле ресурсов в вашу базу данных?

Я полностью согласен с другими, что вы должны использовать linq или типизированные наборы данных и т. Д. Лично мне приходилось только несколько лет прибегать к текстовым запросам, и когда я это делаю, это обычно что-то вроде следующего:

Вы настроили небольшую платформу, а затем все, что вам нужно сделать, это сохранить файл XML. Отдельный конкретный XML-файл намного проще в управлении и развертывании, чем ресурсная DLL. У вас также есть хорошо известное место (хранилище), в котором хранятся Sql Queries и некоторые метаданные о них, а не просто соглашение об именах.

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


Компилятор блокнота, поэтому извиняюсь, если это не 100%. Это всего лишь набросок того, как все взаимодействует.

public static class SqlResource
{
    private static Dictionary<string,SqlQuery> dictionary;

    public static void Initialize(string file)
    {
        List<SqlQuery> list;

        // deserialize the xml file
        using (StreamReader streamReader = new StreamReader(file))
        {
            XmlSerializer deserializer = new XmlSerializer(typeof(List<SqlQuery>));
            list = (List<SqlQuery>)deserializer.Deserialize(streamReader);
        }
        dictionary = new Dictionary<string,SqlQuery>();
        foreach(var item in list )
        {
            dictionary.Add(item.Name,item);
        }
    }
    public static SqlQuery GetQueryByName(string name)
    {
        SqlQuery query = dictionary[name];

        if( query == null )
            throw new ArgumentException("The query '" + name + "' is not valid.");

        if( query.IsObsolete )
        {
           // TODO - log this.
        }
        return query;

    }
}

public sealed class SqlQuery
{
    [XmlAttributeAttribute("name")]
    public bool Name { get; set; }

    [XmlElement("Sql")]
    public bool Sql { get; set; }

    [XmlAttributeAttribute("obsolete")]
    public bool IsObsolete { get; set; }

    [XmlIgnore]
    public TimeSpan Timeout { get; set;}

    /// <summary>
    /// Serialization only - XmlSerializer can't serialize normally
    /// </summary>
    [XmlAttribute("timeout")]
    public string Timeout_String 
    {
        get { return Timeout.ToString();  }
        set { Timeout = TimeSpan.Parse(value); } 
    }
}

Ваш XML-файл может выглядеть как

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSqlQuery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <SqlQuery name="EmployeeByEmployeeID" timeout="00:00:30" >
      <Sql>
SELECT * From Employee WHERE EmployeeID = @T0     
      </Sql>
    </SqlQuery>
    <SqlQuery name="EmployeesForManager" timeout="00:05:00" obsolete="true" >
      <Sql>
SELECT * From Employee WHERE ManagerID = @T0      
      </Sql>
    </SqlQuery>
</ArrayOfSqlQuery>
0 голосов
/ 03 июня 2010

Вы также можете использовать файл конфигурации XML, чтобы связать имена с хранимыми процедурами. Я делаю это для текущего проекта C #. «Запрос» будет определять, какую процедуру вызывать.

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

Иногда для небольших проектов можно использовать параметризованные SQL-запросы (не объединять строки). Это особенно верно для избранных операторов.

Представления также могут использоваться для выбора вместо хранимых процедур.

Rob

0 голосов
/ 07 ноября 2008

Хорошо, я попытаюсь ответить снова, теперь, когда у меня будет больше информации.

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

0 голосов
/ 07 ноября 2008

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

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

0 голосов
/ 07 ноября 2008

Я бы посмотрел строго типизированные наборы данных с табличными адаптерами и позволил табличным адаптерам обрабатывать все запросы. Когда вы используете его, вы никогда не вернетесь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...