C# SqlConnection和SqlDataReader的重用
如果我想在不同的表上运行多个SELECT查询,我可以对它们使用相同的SqlDataReader和SqlConnection吗??以下是明智的吗??(我打字速度很快,因此缺少try/catch):C# SqlConnection和SqlDataReader的重用,c#,.net,sqldatareader,C#,.net,Sqldatareader,如果我想在不同的表上运行多个SELECT查询,我可以对它们使用相同的SqlDataReader和SqlConnection吗??以下是明智的吗??(我打字速度很快,因此缺少try/catch): 非常感谢。您可以对它们中的每一个使用相同的连接,只要您不尝试同时从不同线程在同一连接上执行多个查询 对于数据读取器,您实际上并没有重新使用读取器,每次调用ExecuteReader都会返回一个新读取器的新实例,您所使用的只是保持对读取器引用的变量。这里存在一个问题,您只是显式地关闭最后一个读卡器,而将第
非常感谢。您可以对它们中的每一个使用相同的连接,只要您不尝试同时从不同线程在同一连接上执行多个查询 对于数据读取器,您实际上并没有重新使用读取器,每次调用
ExecuteReader
都会返回一个新读取器的新实例,您所使用的只是保持对读取器引用的变量。这里存在一个问题,您只是显式地关闭最后一个读卡器,而将第一个读卡器留在以后的某个时间进行GC
您也可以重用该命令,但请记住,如果您提供了参数等,则需要在下一个查询中清除这些参数,除非它们也应用于下一个查询
您应该使用try/finally
块来确保清理资源,或者下面是对代码的一个快速更改,以使用使用语句来确保清理资源,即使存在阻止其余代码执行的异常
using (var myConnection = GetTheConnection())
{
myConnection.Open();
var myCommand = new MySqlCommand("SELECT * FROM table1", myConnection))
using (var myDataReader = myCommand.ExecuteReader())
{
while(myReader.Read())
{
//Perform work.
}
} // Reader will be Disposed/Closed here
myCommand.commandText = "SELECT * FROM table2";
using (var myReader = myCommand.ExecuteReader())
{
while(myReader.Read())
{
//Perform more work
}
} // Reader will be Disposed/Closed here
} // Connection will be Disposed/Closed here
注意:GetTheConnection
只是一个占位符函数,用于获取连接实例所使用的任何机制。我通常使用适配器,因此我对读卡器的细节不太了解,但我认为您的思路是对的
代码中需要注意的一点是,每次调用ExecuteReader
都应该生成一个新的数据读取器。您可能正在重用变量名,但对现有读取器的引用将被丢弃,并在每次调用时替换为一个新的读取器。关键是,在使用ExecuteReader获取新的读卡器之前,请先关闭上一个读卡器。您应该研究如何使用实体框架。可能会有帮助:您的上述代码是否给出任何错误?如果没有,那当然没关系。你不需要重用读卡器,ExecuteReader
会创建一个新的读卡器。谢谢。因此,我想我只需要在每次执行后关闭reader对象。实际上,我正在为SqlCommand提供参数,我想我应该使用myCommand.parameters.Clear()。非常感谢。@PaulG,根据经验,每当类实现IDisposable时,您都应该尽早处理它。在读卡器的情况下,它们会占用数据库服务器资源,直到它们被关闭或释放,因此您希望在处理完它们后立即进行释放。现在我看到您使用的是MySQL,所以我不知道资源使用情况如何,但是对于基于服务器的DBMS系统,如Oracle或SQL server,情况就是这样,您应该始终假设情况就是这样。
using (var myConnection = GetTheConnection())
{
myConnection.Open();
var myCommand = new MySqlCommand("SELECT * FROM table1", myConnection))
using (var myDataReader = myCommand.ExecuteReader())
{
while(myReader.Read())
{
//Perform work.
}
} // Reader will be Disposed/Closed here
myCommand.commandText = "SELECT * FROM table2";
using (var myReader = myCommand.ExecuteReader())
{
while(myReader.Read())
{
//Perform more work
}
} // Reader will be Disposed/Closed here
} // Connection will be Disposed/Closed here