的SqlConnection和SqlDataReader的重用(Reuse of SqlConnec

2019-09-16 12:30发布

如果我想在不同的表运行多个SELECT查询,我可以使用它们全部相同SqlDataReader对象和SqlConnection的? 将下面是明智之举? (我快速打字这件事,所以它缺乏的try / catch):

MySqlCommand myCommand = new MySqlCommand("SELECT * FROM table1", myConnection);

myConnection.Open();
SqlDataReader myDataReader = myCommand.ExecuteReader();

while(myReader.Read())
{
    //Perform work.
}

myCommand.commandText = "SELECT * FROM table2";

myReader = myCommand.ExecuteReader();

while(myReader.Read())
{
    //Perform more work
}

myReader.Close();
myConnection.Close();

非常感谢。

Answer 1:

您可以使用为他们每个人相同的连接,只要你不尝试从不同的线程在同一连接上同时执行多个查询。

对于数据读取器,你是不是真正的读者重新使用,每次调用ExecuteReader返回一个新的阅读器的新实例,您要重新使用所有是维持基准读者变量。 在这里躺着一个问题,你只明确关闭最后一个读者,留下第一个在一段时间后进行GC'd。

您可以重复使用命令为好,但要记住,如果你提供的参数等,则需要清除它们的下一个查询,除非它们应用到下一个查询也是如此。

您应该使用try/finally块,以确保您清理资源,或这里是一个快速改变你的代码中使用using语句,以确保资源的清理,即使存在阻止代码的其余部分从执行异常。

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是只为你使用,让您连接实例什么都机构的占位符的功能。



Answer 2:

我一般使用的适配器,所以我对读者的细节生锈,但我认为你是在正确的轨道上。

注意:在您的代码中的一个项目是每次调用ExecuteReader应该产生一个新的数据读取器。 您可重用变量名,而是参考现有的读者是通过在每次调用一个新的丢弃和更换。 点是,使用的ExecuteReader得到一个新之前关闭前面的阅读器。



文章来源: Reuse of SqlConnection and SqlDataReader