2015-02-24 163 views
0

我需要将WCF Web服务连接到SQL Server数据库。我只需要使用SQL来访问数据,不需要LINQ或实体框架。WCF数据库连接:只有一个数据库连接

我试图按照本教程: 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如何处理这个问题,将创建多少服务实例等。 谢谢你的帮助!

+0

您可以创建静态:请参阅下面的回答 – 2015-02-24 19:43:41

+0

每次连接都有什么问题?合并需要照顾管理费用。 – DonBoitnott 2015-02-24 19:44:43

+0

我认为理想情况下,只要服务处于活动状态,就应该打开数据库连接,因为如果x客户端同时连接到Web服务,则会创建x个数据库连接。我对吗?什么是共享? @DavidP我想这样做,我只是想确保这种做法是正确的! – Michael 2015-02-24 19:55:37

回答

4

这是保持连接打开只只要需要一般的最佳实践。

您可以通过高效管理资源来提高性能。 ADO.NET数据提供程序对象实现IDisposable,允许您使用using statements确保这些对象及其非托管资源(如数据库连接)得到正确和可预测的发布。

只要您拨打Dispose()(又调用Close())对象 - 它会将连接释放回连接池。

现代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 
       } 
      } 
    } 
} 
+0

非常感谢您的详细解释!这使事情变得非常清楚。 – Michael 2015-02-25 20:48:01

+0

加上一个代码片断,我从我的手机回答,这太麻烦了 – Wjdavis5 2015-02-26 02:48:10

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 
    } 
} 
+3

这是个坏主意。通过使实例处于静态状态,WCF服务一次只能处理一个请求。更糟糕的是,你需要实际跟踪关闭连接;在某处发生错误,下一次调用'.Open()'(这是无可指责的)将会爆炸。连接汇集;一个'SqlConnection'不代表一个物理连接,到目前为止,处理它们的最好办法是尽可能地限制它们的范围。 – 2015-02-24 21:55:39

1

连接代码和指令代码应该使用using语句,以确保事情得到适当的清理。当您创建初始连接时,池将会启动。当连接处理后,它将被释放到池中再次被使用。您可以使用连接字符串控制池的大小。