1

IISにホストされたC#Webサービスが必要であり、そのメソッドSOL Queryに渡すことができ、Webサービスと戻りデータを含む同じサーバーに存在するAccess2007DBファイルに対してクエリを実行します。

すでに次のコードを使用しています

<%@ 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(進行中)のように表示されますが、データや例外は返されません。

4

2 に答える 2

6

デザインとコード構造にいくつかの改善を提案してもいいですか?

1.これをWebサービスにする理由を再評価します。これをクラスライブラリアセンブリ(.dll)にコンパイルして、他のプロジェクトから参照できますか?Webサービス呼び出しを行うためのオーバーヘッド、つまり時間コストは、別のライブラリへの参照よりもはるかに大きくなります。はい、Accessには設定上の問題があり、対処する必要があります。

2.呼び出しごとにDataSetを返す理由を再検討します。ADO.NETデータセットの欠点に関する優れた記事は次のとおりです。www.4guysfromrolla.com/articles/ 050405-1.aspx

3.最初に文字列を評価またはパラメータ化せずに、与えられた文字列を実行しないでください。すべてのデータベースクエリを処理するレイヤーを作成したいという願望を理解しています。そのアイデアに拍手を送る必要があります。ただし、提示されているコードは、不正な形式のステートメントなどをチェックしないため、より危険な状況を作成します。したがって、渡された文字列を実行しないことをお勧めします。おそらく、このWebサービスはLAN内のみであり、すべての通話が正直で非破壊的であると信じているかもしれません。内部活動はすべて良いと思うかもしれませんが、従業員が悪くなるとすぐに、内部妨害の可能性が開かれます。

誰かが次のようにWebサービスを呼び出すとどうなりますか。

ExecuteQuery("DELETE FROM Customers")

また

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

また

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

4.レイヤーに公開する関数ごとに1つの新しいWebメソッドを作成します。たとえば、クライアントが呼び出す代わりに

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();
        }
于 2009-06-01T17:11:22.783 に答える
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;
    }
}

リソースリークが気に入らない限り、これを実行してください。

于 2009-06-01T17:15:23.170 に答える