2

SQL Server 2005にアクセスする既存のWCFコードがいくつかありますが、正直なところ、その開発者のメソッドを信用できなくなったので、これを正しく専門的に行う方法を知りたいと思います。結果のデータセットを返すメソッド(クライアントからではなく、WCFサービス内)にSQLステートメントを渡すことができる必要があります(クライアントではなく、それを呼び出したWCFのメソッドに)。エンティティフレームワークやその他の抽象化レイヤーには興味がありません。SQL、DML、できればDDLも実行する必要があります。

接続の管理方法も知りたいです。

よろしければ、より良い代替案についての考えを指摘してください。私は聞く準備ができています。

4

2 に答える 2

12

正直なところ、WCFサービスからSQLServerアクセスするべきではありません。

内部にSQLServerがあることを知らなくても、WCFサービスからデータにアクセスする必要があります。

SQLステートメントを受け入れるWebサービスを公開することは、私には間違いなくひどい考えのように見えます。多くの理由(セキュリティなど)で、データベースをサービスのクライアントに公開したくない場合。

あなたができる(すべき)ことは、実際に返したいデータを返すサービスを書くことです。例えば:

[DataContract]
public class Customer
{
    [DataMember]
    public string Name { get; set; }
}

[ServiceContract]
public interface IService
{
    Customer GetCustomer(int customerId);
}

[ServiceBehavior]
public class Service
{
    [OperationContract]
    public Customer GetCustomer(int customerId)
    {
        // Insert DB-related implementation of your query:
        // - you could hard-code a SQL query
        // - you could use Entity-Framework or other ORM
        //
        // First, create your connection to your database
        // Then query
        // Then close your connection
        //
        // Example with SQL connection
        // Connection string comes from server configuration (app.config or whatever)
        using (SqlConnection cn = new SqlConnection(connectionString))
        {
            Customer res = new Customer();

            // query here

            Customer.Name = XXX;    // From DB result
        }
    }
}

クライアント側:

ServiceClient proxy = new ServiceClient();
Customer myCustomer = proxy.GetCustomer(42);

SQL接続の再利用について考える必要はありません。データベースの接続プールがこれを処理します。DBへの接続の作成/終了は簡単な操作です。Webサービス呼び出しごとに新しい接続を作成すると、多くの問題(接続の有効期間など)を回避できます。

ステートレスサービスを可能な限り使用すると、多くの時間を節約できます(同時実行の問題、オブジェクトの存続期間の管理など)。

于 2012-04-20T13:58:12.943 に答える
6
  • 接続文字列を構成ファイルに保存します。
  • 好きなだけデータベースに接続してください。接続プールが面倒を見てくれるので、心配する必要はありません。
  • usingSQL 接続を扱う場合は常に使用します。

    Using (sqlConn = new SqlConnection(ConnString)) { }

  • 独自の POCO を作成して結果をクライアントに返します。別のアセンブリで作成して両方のプロジェクト (WCF とクライアント) で共有するか、クライアント側でプロキシを作成するときに WCF に追加するだけです。それらにアクセスできます。

レイアウトの例を次に示します。

public Poco Foo(long id)
{
    try
    {
        using (SqlConnection SqlConn = new SqlConnection(ConnString))
        {
            // execute your commands and do your stuff
            return Poco;
        }
    }
    catch (Exception ex)
    {
        Logger.Log(ex.ToString());
        return null;
    }
}

アップデート

'DataSet` をクライアントに返す方法の例を次に示します。これはお勧めしませんが、うまくいきます。

public DataSet Foo(long id)
    {
        try
        {
            using (SqlConnection SqlConn = new SqlConnection(ConnString))
            {
                SqlCommand sqlCmd = new SqlCommand("Select * From users where userid=@id", SqlConn);
                sqlCmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id;
                DataSet ds = new DataSet();
                using (SqlDataAdapter da = new SqlDataAdapter(sqlCmd))
                {
                    da.Fill(ds, "Users");
                }

                return ds;
            }
        }
        catch (Exception ex)
        {
            Logger.Log(ex.ToString);
            return null;
        }
    }
于 2012-04-20T13:51:21.840 に答える