2009-06-01 43 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; 
    } 
} 

做到這一點,除非你喜歡的資源泄漏。

相關問題