Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SQL Server时,请使用Using语句防止打开连接_C#_Sql Server_Database_Using - Fatal编程技术网

C# 使用SQL Server时,请使用Using语句防止打开连接

C# 使用SQL Server时,请使用Using语句防止打开连接,c#,sql-server,database,using,C#,Sql Server,Database,Using,这是使用using语句在不使用时保持与数据库的连接关闭的正确方法 我有一个构造函数来设置我的连接字符串,并设置一个新的连接,如下所示: public MSSQL() { string ConnectionString = "The address to database"; connection = new SqlConnection(ConnectionString); } 然后我想在这里调用获取数据的函数: public async Task AddEm

这是使用
using
语句在不使用时保持与数据库的连接关闭的正确方法

我有一个构造函数来设置我的连接字符串,并设置一个新的连接,如下所示:

public MSSQL()
{
    string ConnectionString = "The address to database";
    connection = new SqlConnection(ConnectionString);
}
然后我想在这里调用获取数据的函数:

public async Task AddEmployee(Employee emp, string storedProcedureToAddEmployee = "AddEmployee")
{
    MSSQL rep = new MSSQL();
    using (rep.connection) { await connection.QueryAsync<Employee>(storedProcedureToAddEmployee, "Adding all info"}
}
public异步任务AddEmployee(Employee emp,string-storedProcedureToAddEmployee=“AddEmployee”)
{
MSSQL rep=新的MSSQL();
使用(rep.connection){wait connection.QueryAsync(storedProcedureToAddEmployee,“添加所有信息”}
}
下面是我如何解释他的解决方案(解释得非常模糊)

public异步任务AddEmployee(Employee emp,string-storedProcedureToAddEmployee=“AddEmployee”)
{            
使用(IDbConnection con=newSQLConnection(“ConnectionString”))
{ 
等待con.QueryAsync(storedProcedureToAddEmployee,“添加所有信息”);
}
}

它们有何不同,或者我遗漏了什么?

只需指出:后台的Db驱动程序可以并且将根据需要处理连接,因此在代码中关闭连接并不一定会关闭真正的连接(很可能只有事务)中间部分看起来很危险,因为您正在处理一个您不拥有的对象。^并且所有者也不会试图处理它。如果您有一个类存储/负责
SqlConnection
,该类应该实现
IDisposable
本身,您应该
使用该类,并且该类应该d在其dispose中处置连接。您似乎一开始就不需要该类。根本不要将连接存储在字段中。第三个选项实际上是唯一的选项。ADO.NET的连接池会重置连接并将其放在连接池中以备重用,因此缓存连接对象不会带来任何好处。事实上,缓存的连接将保留从以前的查询中获取的任何锁,在第三种情况下(可能只是使用(var con=new SqlConnection(..)来
)会逐渐导致数据库冲突增加和阻塞)
,在将连接放回连接池之前重置连接时,将回滚所有现有事务,并释放所有获取的锁。下次需要连接时,将从连接池中获得一个现有的干净连接
public async Task AddEmployee(Employee emp, string storedProcedureToAddEmployee = "AddEmployee")
{            
    using (IDbConnection con = new SqlConnection("ConnectionString")) 
    { 
        await con.QueryAsync<Employee>(storedProcedureToAddEmployee, "Adding all info"); 
    }
}