我有一些访问 SQL Server 2005 的现有 WCF 代码,但老实说,我开始不信任该开发人员的方法,所以我想知道应该如何正确和专业地完成这项工作。我需要能够将 SQL 语句传递给返回结果数据集的方法(在 WCF 服务内,而不是来自客户端)(传递给 WCF 中调用它的方法,而不是客户端)。我对实体框架或其他抽象层不感兴趣。我需要运行 SQL、DML,希望也能运行 DDL。
我也想知道如何管理连接。
如果您愿意,请指出您对更好替代方案的想法。我准备听了。
我有一些访问 SQL Server 2005 的现有 WCF 代码,但老实说,我开始不信任该开发人员的方法,所以我想知道应该如何正确和专业地完成这项工作。我需要能够将 SQL 语句传递给返回结果数据集的方法(在 WCF 服务内,而不是来自客户端)(传递给 WCF 中调用它的方法,而不是客户端)。我对实体框架或其他抽象层不感兴趣。我需要运行 SQL、DML,希望也能运行 DDL。
我也想知道如何管理连接。
如果您愿意,请指出您对更好替代方案的想法。我准备听了。
老实说,您不应该从 WCF 服务访问SQL Server。
您应该从 WCF Service访问数据,而不知道底层有 SQL Server。
公开一个接受 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 连接。您的数据库的连接池将为您处理此问题。创建/关闭与数据库的连接是一项轻量级的操作。为每个 web 服务调用创建一个新连接将避免很多麻烦(连接生命周期......等等)。
尽可能使用无状态服务,它会为你节省大量时间(并发问题,对象生命周期管理......)。
using
在处理 sql 连接时始终使用。
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;
}
}