Как выполнить запросы SQL в файле Access 2007 из веб-службы C #? - PullRequest
1 голос
/ 01 июня 2009

Мы хотим иметь размещенную в IIS веб-службу C #, которую я могу передать ее методу SOL Query, и она выполняет запрос к файлу БД Access 2007, который существует на том же сервере, который содержит веб-службу, и возвращает данные.

Мы уже используем следующий код

<%@ WebService Language="C#" 
  CodeBehind="~/App_Code/Service.cs" 
  Class="Service" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

using System.Data;
using System.Data.OleDb;
using System.IO;

public class Service : System.Web.Services.WebService
{
    [WebMethod]
    public DataSet ExecuteQuery(string sqlQuery) 
    {
        OleDbConnection conn = new OleDbConnection(
             @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + 
             @"C:\Folder\Database2.accdb;Persist Security Info=False;");

        OleDbDataAdapter da = new OleDbDataAdapter(sqlQuery, conn);
        DataSet ds = new DataSet();
        da.Fill(ds);            
        return ds;
    }

}

но когда мы вызываем этот метод, страница просто отображается как в Load (в процессе), но без какого-либо возврата данных или исключения.

Ответы [ 2 ]

6 голосов
/ 01 июня 2009

Могу ли я предложить несколько улучшений для вашего дизайна и структуры кода?

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();
        }
0 голосов
/ 01 июня 2009

Также:

using (OleDbConnection conn = new OleDbConnection(
         @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + 
         @"C:\Folder\Database2.accdb;Persist Security Info=False;"))
{
    using (OleDbDataAdapter da = new OleDbDataAdapter(sqlQuery, conn))
    {
        DataSet ds = new DataSet();
        da.Fill(ds);            
        return ds;
    }
}

Делайте это, если вам не нравятся утечки ресурсов.

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