C# 中 Opening/Closing SqlConnection 的最佳方法是什么
What is Best Approach for Opening/Closing SqlConnection in C#
我想知道用 Sql Server 2008R2 Express Edition
数据库打开 SqlConnection
的最佳方法是什么。此版本的 Sql 具有 RAM 使用和 CPU 使用的限制,因此我们必须采用最佳方式打开 SqlConnection
。
现在我正在检查每个方法的开始和结束时的连接。这是一个例子。
private void CheckValidId(string Id)
{
CheckConnectionStatus();
try
{
sqlConnection.Open();
sqlCommand = new SqlCommand("select * from ValidId where id=@id", sqlConnection);
sqlCommand.Parameters.AddWithValue("@id", Id);
sqlDataReader = sqlCommand.ExecuteReader();
While (sqlDataReader.Read())
{
string Test = sqlDataReader["Id"].toString();
MessageBox.Show("Value of Id : " , Test);
}
}
catch (Exception exp)
{
MessageBox.Show(exp.Message.ToString(), "Exception in CheckValidId");
}
finally
{
CheckConnectionStatus();
}
}
这里是CheckConnectionStatus
方法
private void CheckConnectionStatus()
{
if (sqlConnection.State == ConnectionState.Open)
{
sqlConnection.Close();
}
}
执行此操作的最佳方法是什么。
谢谢
只需使用 using
,因为它会在完成后处理连接。
using(SqlConnection conn = new SqlConnection("Connection string")){
//do sql stuff
conn.Open();
//etc etc
conn.Close();
}
您需要使用一次性模式来确保所有物品都已关闭并妥善处理:
var query = "select * from ValidId where id=@id";
using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString))
using (var command = new System.Data.SqlClient.SqlCommand(query, conn))
{
command.Parameters.Add("@id", SqlDbType.Int).Value = Id;
conn.Open;
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
string Test = reader["Id"].ToString();
}
}
command.Parameters.Clear();
}
您不需要检查连接状态;它会在处理时关闭。
需要注意一件事:明确指定参数数据类型是最佳做法。我假设你的情况是 SqlDbType.Int
,但你可以将其更改为实际情况。
另一件需要注意的事情:您不想在 reader while 循环中做太多事情。你想建立你的 collection 或其他什么然后离开那里。您的连接打开的时间越短越好。那是因为您可能对数据库中的某些行持有读取锁定,这可能会影响其他用户及其应用程序。
您打开和关闭的模式是正确的。但是你必须注意,这不会打开和关闭与 SQL 服务器的连接,因此并不能真正解决你对内存使用和 CPU 的担忧 - 事实上它不会有任何区别。
Open 和 Close 所做的是租用和 return 连接到客户端 PC 上的 ADO 连接池。这意味着 Closing an ADO connection 不能保证(并且在大多数情况下不会)关闭和释放与 SQL 服务器的连接。这是因为建立和验证连接相对昂贵且缓慢,因此 ADO 连接池将您的连接保存在一个池中,仍然打开,以防您想要重新建立连接。
与 SQL 服务器不同的是它需要执行的并发查询的数量 - 以及查询的数据集大小,以及数据库中数据的总大小。
并发查询挤压 CPU,数据集 return 挤压可用 RAM。显然,您的数据库越大,在 RAM 中缓存的内容就越少,因此您在查询时获得缓存命中的可能性就越小。
在实践中,我对 SQL Express 版本的体验是,除非你正在做一些非常具体的事情,否则你不会注意到它与完整版本 SQL Server 之间的任何区别;
1) 编写一个 BI 风格的工具,允许用户构建用户定义的或用户范围的查询。
2) 写糟糕的 SQL - "big SQL" 可能会掩盖你糟糕的查询语法,但 Express 不能,因为它的可用 RAM 较少。
如果您编写高效、受限的 SQL,您实际上可能永远不会遇到任何 SQL Express 的限制。
我想知道用 Sql Server 2008R2 Express Edition
数据库打开 SqlConnection
的最佳方法是什么。此版本的 Sql 具有 RAM 使用和 CPU 使用的限制,因此我们必须采用最佳方式打开 SqlConnection
。
现在我正在检查每个方法的开始和结束时的连接。这是一个例子。
private void CheckValidId(string Id)
{
CheckConnectionStatus();
try
{
sqlConnection.Open();
sqlCommand = new SqlCommand("select * from ValidId where id=@id", sqlConnection);
sqlCommand.Parameters.AddWithValue("@id", Id);
sqlDataReader = sqlCommand.ExecuteReader();
While (sqlDataReader.Read())
{
string Test = sqlDataReader["Id"].toString();
MessageBox.Show("Value of Id : " , Test);
}
}
catch (Exception exp)
{
MessageBox.Show(exp.Message.ToString(), "Exception in CheckValidId");
}
finally
{
CheckConnectionStatus();
}
}
这里是CheckConnectionStatus
方法
private void CheckConnectionStatus()
{
if (sqlConnection.State == ConnectionState.Open)
{
sqlConnection.Close();
}
}
执行此操作的最佳方法是什么。
谢谢
只需使用 using
,因为它会在完成后处理连接。
using(SqlConnection conn = new SqlConnection("Connection string")){
//do sql stuff
conn.Open();
//etc etc
conn.Close();
}
您需要使用一次性模式来确保所有物品都已关闭并妥善处理:
var query = "select * from ValidId where id=@id";
using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString))
using (var command = new System.Data.SqlClient.SqlCommand(query, conn))
{
command.Parameters.Add("@id", SqlDbType.Int).Value = Id;
conn.Open;
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
string Test = reader["Id"].ToString();
}
}
command.Parameters.Clear();
}
您不需要检查连接状态;它会在处理时关闭。
需要注意一件事:明确指定参数数据类型是最佳做法。我假设你的情况是 SqlDbType.Int
,但你可以将其更改为实际情况。
另一件需要注意的事情:您不想在 reader while 循环中做太多事情。你想建立你的 collection 或其他什么然后离开那里。您的连接打开的时间越短越好。那是因为您可能对数据库中的某些行持有读取锁定,这可能会影响其他用户及其应用程序。
您打开和关闭的模式是正确的。但是你必须注意,这不会打开和关闭与 SQL 服务器的连接,因此并不能真正解决你对内存使用和 CPU 的担忧 - 事实上它不会有任何区别。
Open 和 Close 所做的是租用和 return 连接到客户端 PC 上的 ADO 连接池。这意味着 Closing an ADO connection 不能保证(并且在大多数情况下不会)关闭和释放与 SQL 服务器的连接。这是因为建立和验证连接相对昂贵且缓慢,因此 ADO 连接池将您的连接保存在一个池中,仍然打开,以防您想要重新建立连接。
与 SQL 服务器不同的是它需要执行的并发查询的数量 - 以及查询的数据集大小,以及数据库中数据的总大小。
并发查询挤压 CPU,数据集 return 挤压可用 RAM。显然,您的数据库越大,在 RAM 中缓存的内容就越少,因此您在查询时获得缓存命中的可能性就越小。
在实践中,我对 SQL Express 版本的体验是,除非你正在做一些非常具体的事情,否则你不会注意到它与完整版本 SQL Server 之间的任何区别;
1) 编写一个 BI 风格的工具,允许用户构建用户定义的或用户范围的查询。 2) 写糟糕的 SQL - "big SQL" 可能会掩盖你糟糕的查询语法,但 Express 不能,因为它的可用 RAM 较少。
如果您编写高效、受限的 SQL,您实际上可能永远不会遇到任何 SQL Express 的限制。