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





Я бы поискал строго типизированные наборы данных с помощью адаптеров таблиц и позволил адаптерам таблиц обрабатывать все запросы. Когда вы привыкнете к нему, вы никогда не вернетесь.
Просто добавьте набор данных в свое решение, добавьте соединение и адаптер таблицы для таблицы, затем начните сборку всех запросов (обновление, выбор, удаление, поиск и т. д.) И легко обработайте это в коде.
Хорошо, я попробую ответить еще раз, теперь, когда у меня будет больше информации.
Я бы сделал класс запроса, который содержал бы все строки запроса как общие свойства или функции, которые можно было бы назвать достаточно хорошо, чтобы их было легко использовать.
Я нахожусь в той же ситуации с некоторыми разработчиками, которые предпочитают писать запросы в файле ресурсов. Мы используем дозвуковой, и я бы предпочел использовать хранимые процедуры, а не прямые запросы.
Один из вариантов, даже если он плохой, - поместить эти запросы в файл конфигурации и прочитать при необходимости, но это очень плохой вариант, и мы можем использовать его, если все не могут согласиться с использованием хранимых процедур.
Файлы ресурсов обычно используются для локализации. Но строка - это просто строка, это просто строка, и вы действительно хотите отправлять любую старую строку из файла ресурсов в свою базу данных?
Я полностью согласен с другими, что вы должны использовать linq или типизированные наборы данных и т. д. Лично мне приходилось прибегать к текстовым запросам всего несколько раз за эти годы, и когда я это делаю, обычно это примерно следующее:
Вы настраиваете небольшую структуру, а затем все, что вам нужно сделать, это сохранить файл Xml. Один конкретный файл xml намного проще в управлении и развертывании, чем dll ресурсов. У вас также есть хорошо известное место (репозиторий), в котором хранятся запросы Sql и некоторые метаданные о них, а не просто некоторые соглашения об именах.
Никогда не недооценивайте полезность (простого) класса над строковым литералом. После того, как вы начали использовать класс, вы можете добавлять в дальнейшем вещи, которые вы не можете (легко) сделать с помощью простой строки.
Компилятор блокнота, извиняюсь, если это не 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>
Вы также можете использовать файл конфигурации XML для связывания имен с хранимыми процедурами. Я делаю это для текущего проекта C#. «Запрос» определит, какую процедуру вызывать.
Поскольку некоторые движки баз данных не поддерживают хранимые запросы, это не всегда вариант.
Иногда для небольших проектов можно использовать параметризованные SQL-запросы (не объединять строки). Это особенно верно для утверждений select.
Представления также можно использовать для выбора вместо хранимых процедур.
Роб
Большая часть моего доступа к данным осуществляется через SubSonic и строго типизирована. Однако иногда у меня возникают очень сложные запросы, которые нужно записать.