C# WCF数据库连接:仅一个数据库连接
我需要将WCF Web服务连接到SQL Server数据库。我只需要使用SQL来访问数据,没有LINQ或实体框架 我尝试遵循本教程: . SqlConnection类似乎是我需要使用的,但当我看到此服务方法时:C# WCF数据库连接:仅一个数据库连接,c#,sql-server,wcf,C#,Sql Server,Wcf,我需要将WCF Web服务连接到SQL Server数据库。我只需要使用SQL来访问数据,没有LINQ或实体框架 我尝试遵循本教程: . SqlConnection类似乎是我需要使用的,但当我看到此服务方法时: public string InsertUserDetails(UserDetails userInfo) { // ... SqlConnection con = new SqlConnection("Data Source=.;Initial
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如何处理这个问题,会创建多少服务实例等等。。
谢谢你的帮助 只要确保每次都能打开和关闭它
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
}
}
每次都要确保打开和关闭它
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
}
}
通常最好的做法是只在需要时保持连接打开 您可以通过高效地管理资源来提高性能。ADO.NET数据提供程序对象实现了
IDisposable
,允许您使用它来确保这些对象及其非托管资源(如数据库连接)得到正确和可预测的释放
只要在SqlConnection
对象上调用Dispose()
(这反过来调用Close()
),它就会将连接释放回连接池
现代的关系数据库管理系统可以同时处理成千上万的连接。作为一名开发人员,您的职责是确保只在需要时保持连接打开。因此,打开连接,运行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
}
}
}
}
通常最好的做法是只在需要时保持连接打开 您可以通过高效地管理资源来提高性能。ADO.NET数据提供程序对象实现了
IDisposable
,允许您使用它来确保这些对象及其非托管资源(如数据库连接)得到正确和可预测的释放
只要在SqlConnection
对象上调用Dispose()
(这反过来调用Close()
),它就会将连接释放回连接池
现代的关系数据库管理系统可以同时处理成千上万的连接。作为一名开发人员,您的职责是确保只在需要时保持连接打开。因此,打开连接,运行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
}
}
}
}
您的连接代码和命令代码应该使用using语句来确保正确地清理这些内容。当您创建初始连接时,池将启动。当连接被释放时,它将被释放到池中,以便再次使用。您可以使用连接字符串来控制池的大小。您的连接代码和命令代码应该使用using语句来确保正确清理池中的内容。当您创建初始连接时,池将启动。当连接被释放时,它将被释放到池中,以便再次使用。您可以使用连接字符串控制池的大小。您可以创建静态:请参阅下面的答案每次连接都有什么问题?池化处理开销。我认为理想情况下,只要服务还活着,db连接就应该保持打开状态,因为如果x个客户端同时连接到web服务,就会创建x个数据库连接。我说得对吗?什么是联营@大卫,我想这样做,我只是想确保这种方法是正确的!是的,如果10个客户端同时连接到该服务,您可能会得到10个数据库连接——这通常是您想要的,因为您想要同时为10个客户端提供服务。您可以将WCF配置为将客户端的最大数量限制在您的服务器可以处理的范围内——典型的SQL server可以毫无问题地处理数百到数千个连接;这取决于这些连接在做什么。简单的插入是没有问题的。如果客户端一个接一个地连接,那么最终只会有一个到数据库的物理连接(SqlConnection只是一个包装器)。实际上,您很可能正在为每个客户端会话创建一个全新的服务实例(WCF服务的默认实例模式)。我发现您发布的代码片段唯一的错误是缺少对
SqlCommand
和SqlConnection
使用语句?池化处理开销。我认为理想情况下,只要服务还活着,db连接就应该保持打开状态,因为如果x个客户端同时连接到web服务,就会创建x个数据库连接。我说得对吗?什么是联营@大卫,我想这样做,我只是想确保这种方法是正确的!是的,如果10个客户端同时连接到该服务,您可能会得到10个数据库连接——这通常是您想要的,因为您想要同时为10个客户端提供服务。您可以将WCF配置为将客户端的最大数量限制在您的服务器可以处理的范围内——典型的SQL server可以毫无问题地处理数百到数千个连接;这取决于这些连接在做什么。简单的插入是没有问题的。如果客户端一个接一个地连接,那么最终只会有一个到数据库的物理连接(SqlConnection
只是一个包装器)。实际上,您很可能正在为每个客户端会话创建一个全新的服务实例(WCF服务的默认实例模式)。我所看到的您发布的代码片段的唯一错误是缺少对SqlCo使用语句的