我需要将WCF Web服务连接到SQL Server数据库。我只需要使用SQL来访问数据,不需要使用LINQ或实体框架。
我尝试按照本教程: http://www.c-sharpcorner.com/UploadFile/rohatash/inserting-data-into-database-using-wcf-service/。 SqlConnection类似乎是我需要使用的,但是当我看到这个服务方法时:
public string InsertUserDetails(UserDetails userInfo)
{
// ...
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Rajesh;User ID=sa;Password=wintellect");
con.Open();
SqlCommand cmd = new SqlCommand("insert into RegistrationTable(UserName,Password,Country,Email) values(@UserName,@Password,@Country,@Email)", con);
cmd.Parameters.AddWithValue("@UserName", userInfo.UserName);
cmd.Parameters.AddWithValue("@Password", userInfo.Password);
cmd.Parameters.AddWithValue("@Country", userInfo.Country);
cmd.Parameters.AddWithValue("@Email", userInfo.Email);
int result = cmd.ExecuteNonQuery();
// ...
}
我很担心,因为很明显,每个请求都会创建一个数据库连接。
以下是我想要的代码结构示例:
public class Service : IService
{
public Company GetCompany(int key)
{
// Get existing database connection
// SELECT * from companies where c_key=key
// Return Company instance
}
}
我应该使用什么结构来使用SQL访问数据而不是在每个请求上创建数据库连接?我可以将SqlConnection实例设为静态吗?我不明白WCF如何处理这个问题,将创建多少个Service实例等等。 谢谢你的帮助!
答案 0 :(得分:4)
通常最佳做法是只在需要时保持连接打开。
您可以通过有效管理资源来提高绩效。 ADO.NET数据提供程序对象实现IDisposable
,允许您使用using statements来确保正确且可预测地释放这些对象及其非托管资源(如数据库连接)。
只要在Dispose()
对象上调用Close()
(进而调用SqlConnection
),它就会将连接释放回连接池。
现代RDBMS旨在同时处理成千上万的连接。您作为开发人员的一部分是确保只在需要时保持连接打开。因此,打开连接,运行SQL,获取结果,关闭连接。
遵循类似的内容:
using (var conn = new SqlConnection(ConnectionString))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM SomeTable";
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// DO SOME WORK
}
}
}
}
答案 1 :(得分:1)
您的连接代码和命令代码应使用using语句,以确保正确清理内容。当您创建初始连接时,池将启动。当连接处置它时,它将被释放到池中以便再次使用。您可以使用连接字符串控制池的大小。
答案 2 :(得分:0)
请确保每次都打开和关闭它。
public class Service : IService
{
private static SQLConnection con;
public Company GetCompany(int key)
{
// Get existing database connection
// SELECT * from companies where c_key=key
// Return Company instance
}
}