正直なところ、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サービス呼び出しごとに新しい接続を作成すると、多くの問題(接続の有効期間など)を回避できます。
ステートレスサービスを可能な限り使用すると、多くの時間を節約できます(同時実行の問題、オブジェクトの存続期間の管理など)。