调用reader.Close时执行XmlReader和CloseConnection

时间:2011-07-27 21:56:16

标签: c# asp.net sql-server-2005 ado.net

我有一个带静态方法的静态DataAccess类:MyExecuteReader(返回sqldatareader)和MyExecuteXmlReader(返回XmlReader)。

现在使用ExecuteReader方法,我可以执行SqlCommand.ExecuteReader(CommandBehavior.CloseConnection),这将在我关闭阅读器时关闭连接。

SqlCommand.ExecuteXmlReader()没有类似的方法。

那么在这种情况下确保关闭相应连接的最佳方法是什么?

注意:

我的查询返回XML,即使用FOR XML AUTO。这就是我使用XmlReader的原因。返回的字段被视为SqlString。我可以使用SqlDataReader.GetSqlString方法,但我不确定这是一个好方法。

更新

我可以将XML读入字符串并从DAL返回字符串而不是XmlReader。

我知道使用声明,并且由于某些异常处理问题,我认为该选项已被排除。

5 个答案:

答案 0 :(得分:1)

  

我有一个带静态方法的静态DataAccess类:   MyExecuteReader(返回sqldatareader)和MyExecuteXmlReader(返回   的XmlReader)。

这太吓人了。只有通过阅读这句话,我必须说,对这些事情采用静态方法似乎是错误的。我只需依赖ADO.NET connection pool并将连接包装到using语句中。处置它们不会物理关闭连接。它只是将其返回到连接池以便重用。

但是因为你以这种方式前进(使用静态连接和东西,将代码完全单元测试不友好),我建议你至少将对XmlReader的调用包装成using语句至少要确保你释放底层句柄,否则你将会严重泄漏,这在多线程应用程序中可能会产生灾难性的后果。

答案 1 :(得分:1)

我最终修改了我的DAL中的MyExecuteXmlReader(返回XmlReader )到MyExecuteXmlReader(返回字符串)。

所以现在我从XmlReader读取一个字符串并返回此字符串而不是XmlReader,这解决了在DAL之外关闭阅读器和连接的问题。

答案 2 :(得分:0)

实施使用语句。一个例子是:

using (SqlConnection conn = new SqlConnection(connString))
{
  using(SqlCommand cmd = conn.CreateCommand())
  {
     cmd.CommandText = "SELECT ID, Name FROM Customers";

      conn.Open();

      using (SqlDataReader dr = cmd.ExecuteReader())
      {
          while (dr.Read())
          {
              // do your thing
          }
      }
  }
}

编辑:在SqlCommand

周围使用丢失

答案 3 :(得分:0)

DataReader一次读取一行,保持连接忙。

XmlReader一次读取结果,并且不保持连接忙。所以没有必要关闭它。

答案 4 :(得分:-1)

这是使用more

的方法
[Visual Basic] 
Public Sub ReadMyData(myConnString As String)
    Dim mySelectQuery As String = "SELECT OrderID, CustomerID FROM Orders"
    Dim myConnection As New SqlConnection(myConnString)
    Dim myCommand As New SqlCommand(mySelectQuery, myConnection)
    myConnection.Open()
    Dim myReader As SqlDataReader
    myReader = myCommand.ExecuteReader()
    ' Always call Read before accessing data.
    While myReader.Read()
        Console.WriteLine((myReader.GetInt32(0) & ", " & myReader.GetString(1)))
    End While
    ' always call Close when done reading.
    myReader.Close()
    ' Close the connection when done with it.
    myConnection.Close()
End Sub 'ReadMyData

[C#] 
public void ReadMyData(string myConnString) {
    string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders";
    SqlConnection myConnection = new SqlConnection(myConnString);
    SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);
    myConnection.Open();
    SqlDataReader myReader;
    myReader = myCommand.ExecuteReader();
    // Always call Read before accessing data.
    while (myReader.Read()) {
       Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));
    }
    // always call Close when done reading.
    myReader.Close();
    // Close the connection when done with it.
    myConnection.Close();
 }