Могу ли я предложить несколько улучшений для вашего дизайна и структуры кода?
1. Пересмотрите причину создания этого веб-сервиса. Можете ли вы скомпилировать это в сборку библиотеки классов (.dll) и ссылаться на нее из других проектов? Издержки или затраты времени на вызов веб-службы намного больше, чем ссылка на другую библиотеку. Да, есть проблемы с конфигурацией Access, с которыми вам придется иметь дело.
2. Пересмотрите причину, по которой вы хотите, чтобы набор данных возвращался при каждом вызове. Вот отличная статья о недостатках ADO.NET DataSets: www.4guysfromrolla.com / article / 050405-1.aspx
3. Не выполняйте какую-либо строку, данную вам, без предварительной оценки или параметризации. Я понимаю желание создать слой, который будет обрабатывать все запросы к базе данных, и вам следует приветствовать эту идею. Однако представленный код создаст более опасную ситуацию, так как он не проверяет наличие каких-либо искаженных утверждений и т. Д. Поэтому советуем НЕ выполнять какую-либо строку, переданную вам. Возможно, этот веб-сервис ВНУТРИ только вашей локальной сети, и, возможно, вы уверены, что все вызовы будут честными и неразрушающими. Мы можем думать, что вся внутренняя деятельность хороша, но как только сотрудник становится плохим, вы открываете возможность для внутреннего саботажа.
Что происходит, когда кто-то звонит на ваш веб-сервис следующим образом:
ExecuteQuery("DELETE FROM Customers")
или
ExecuteQuery("UPDATE Employee SET Salary = 250000 WHERE ID= 9")
или
ExecuteQuery("SELECT Salary WHERE EmployeePosition = 'CEO'")
4. Создайте один новый веб-метод для каждой функции, которую вы хотите предоставить слою. Например, вместо клиента звонит
ExecuteQuery("SELECT ID, CustomerName FROM Customers ORDER BY CustomerName")
сделать это:
public List<Customer> ListAllCustomers()
Подумайте о создании таких методов:
public void UpdateEmployee(Employee emp)
или
public void UpdateEmployeeSalary(string id, double salary)
5. Поместите строку подключения Access в файл app.config
. Ссылка System.Configuration
и использование ConfigurationManager
. загружайте его каждый раз, когда вызывается запрос. Это немного снижает производительность, но на самом деле рабочая нагрузка на обслуживание равна нулю при изменении пути к каталогу или имени файла .mdb.
private string GetConnectionString()
{
//do some more checking on whether the value exists as well, instead of just returning it!
return ConfigurationManager.AppSettings["MyAccessDB"].ToString();
}