2009-06-01 42 views
1

我们希望在IIS中拥有托管的C#Web服务,以便将其传递给其方法SOL查询并在存在的Access 2007数据库文件上执行查询在同一台服务器包含Web服务和返回数据
我们已经将以下代码如何从C#Web服务执行Access 2007文件中的SQL查询

<%@ 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; 
    } 

} 

但是当我们调用此方法的页面只是显示为负载(在建),但没有任何数据返回或例外...可以帮助我们找到解决这个问题的方法吗?

+0

传递一个sql查询到一个web服务来执行只是要求被滥用... – 2009-06-01 15:16:08

+1

brb,daily wtf。 – Will 2009-06-01 15:50:23

回答

6

我建议你的设计和代码结构的一些改进?

重新评估使这是一个Web服务的原因。你能编译成类库程序集(.dll)并从其他项目中引用它吗?使Web服务调用的开销或时间成本远大于对另一个库的引用。是的,您必须处理Access的配置问题。

2.重新考虑您希望在每次调用中返回DataSet的原因。这里有一个ADO.NET数据集的缺点的优秀文章:www.4guysfromrolla.com/articles/050405-1.aspx

没有评估或第一参数化它不执行给你任何字符串。我理解创建将处理所有的数据库查询为您层的渴望,以及你应该鼓掌这一想法。该代码,如呈现,然而将创造一个更加危险的境地,因为它不检查任何畸形的陈述等,所以该建议是不执行传递给您的任何字符串。也许这Web服务里面只有你的局域网,也许你们相信,所有电话都将诚实和非破坏性。我们可能会认为,所有的内部活动还是不错的,但是只要雇员转坏,你要打开的内部破坏的可能性。

会发生什么事,当有人拨打你的Web服务这样的:

ExecuteQuery("DELETE FROM Customers") 

ExecuteQuery("UPDATE Employee SET Salary = 250000 WHERE ID= 9") 

ExecuteQuery("SELECT Salary WHERE EmployeePosition = 'CEO'") 

4.每个函数创建一个新的WebMethod你要图层曝光。例如,而不是客户端调用

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

另外:

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; 
    } 
} 

做到这一点,除非你喜欢的资源泄漏。

相关问题