Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# SqlConnection和SqlDataReader的重用_C#_.net_Sqldatareader - Fatal编程技术网

C# SqlConnection和SqlDataReader的重用

C# SqlConnection和SqlDataReader的重用,c#,.net,sqldatareader,C#,.net,Sqldatareader,如果我想在不同的表上运行多个SELECT查询,我可以对它们使用相同的SqlDataReader和SqlConnection吗??以下是明智的吗??(我打字速度很快,因此缺少try/catch): 非常感谢。您可以对它们中的每一个使用相同的连接,只要您不尝试同时从不同线程在同一连接上执行多个查询 对于数据读取器,您实际上并没有重新使用读取器,每次调用ExecuteReader都会返回一个新读取器的新实例,您所使用的只是保持对读取器引用的变量。这里存在一个问题,您只是显式地关闭最后一个读卡器,而将第

如果我想在不同的表上运行多个SELECT查询,我可以对它们使用相同的SqlDataReader和SqlConnection吗??以下是明智的吗??(我打字速度很快,因此缺少try/catch):


非常感谢。

您可以对它们中的每一个使用相同的连接,只要您不尝试同时从不同线程在同一连接上执行多个查询

对于数据读取器,您实际上并没有重新使用读取器,每次调用
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