2011-04-06 26 views
1

我做在C#中的Web应用程序与ASP.Net和我使用的是SQL数据库了。在我看到的指南(关于SqlConnection和SqlCommand)中,他们每次想要发送查询时都会打开并关闭SQL连接。但我不知道这是处理连接的最佳方式,因为我也学到了一些PHP的,据我所知,在PHP中打开一个连接只有一次,在启动。那么处理连接的最佳方式是什么?启动和关闭SQL连接 - 在开始和结束时还是每次需要时?

回答

3

通常你应该有一个连接和交易,为Web请求的长度。

如果你有两个连接,你可能有不一致的数据。例如在第一个查询中,您检查银行余额,然后关闭它。然后,您将5美元添加到余额中,并将其保存在下一个连接中。如果其他人在两个连接之间增加了5美元会怎么样?它会失踪。

做最简单的事情就是打开连接的Global.asax的BeginRequest和保存掳到的HttpContext。每当你需要连接时,从那里拉它。请确保您.Close在连接你的EndRequest

,并阅读了这里连接池:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx 这不是“昂贵”反复打开和关闭连接,提供的用户名是每次都一样。在.NET

+0

+1确切地说,连接池在这里是关键。 – rsenna 2011-04-06 18:51:24

+0

乔恩有一个我认为的观点:http://stackoverflow.com/questions/1058591/net-sqlconnection-class-connection-pooling-and-reconnection-logic – tugberk 2012-02-28 13:27:47

0

通常的做法是打开一个SqlConnection和使用SqlCommand,然后他们两个处理。

using(SqlConnection connection = new SqlConnection("myConnectionString")) 
{ 
    using(SqlCommand command = new SqlCommand("dbo.SomeProc")) 
    { 
     // Execute the command, when the code leaves the using block, each is disposed 
    } 
} 
0

由于与数据库的连接是一个昂贵的资源,所以最好尽可能晚地打开sql连接并尽早关闭。所以你应该在执行命令之前打开连接,并在执行完成后关闭它。

另一方面,如果要在很短的时间间隔内执行许多命令,最好打开一次连接并在所有命令执行后关闭。

1

Ado.Net的连接池已经为您管理,因此您不必担心重新使用连接。

您可以使用Using statement关闭和处置连接:

DataTable dt = new DataTable(); 
    using (SqlConnection conn = new SqlConnection("my_connection_string")) 
    { 
     using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * from Table", conn)) 
     { 
     conn.open(); 
     adapter.Fill(dt);  
     } 
    } 
0

对于他们首先不是因为有正在使用连接池,但SqlCommand的具有过载采取一个连接对象,所以你可以保持连接并传递它。

一般而言:

使用(VAR TS =新的TransactionScope()){ 使用 { 使用 (VAR命令=新的SqlCommand(连接(VAR连接=新的SqlConnection(...)),。 ..) { ... }

using (var command = new SqlCommand(connection, ...) 
{ 
    ... 
} 

}

ts.Complete(); }

当然,我会建议在这一点上使用LINQ到SQL或EF。

0

如果您不想担心打开和关闭连接,请试试Enterprise Library中的数据访问应用程序块。

相关问题