ExecuteXmlReader и CloseConnection при вызове reader.Close - PullRequest
0 голосов
/ 28 июля 2011

У меня есть статический класс DataAccess со статическими методами: MyExecuteReader (возвращает sqldatareader) и MyExecuteXmlReader (возвращает XmlReader).

Теперь с помощью метода ExecuteReader я могу сделать SqlCommand.ExecuteReader (CommandBehavior.CloseConnection), и это закроетсоединение, когда я закрываю читатель.

SqlCommand.ExecuteXmlReader () не имеет аналогичного метода.

Так что в этом случае лучше всего обеспечитьсоответствующее соединение закрыто?

Примечание:

Мой запрос возвращает XML, т.е. использует FOR XML AUTO.Вот почему я использую XmlReader.Возвращенное поле считается SqlString.Я могу использовать метод SqlDataReader.GetSqlString, но я не уверен, что это хороший подход или нет.

Обновление:

Я могу прочитать XML в строку и вернуть строку вместо XmlReader из DAL.

Мне известно об операторе using, и почему-то эта опция была исключена из-за некоторых проблем с обработкой исключений.

Ответы [ 5 ]

1 голос
/ 01 августа 2011

Я закончил тем, что изменил MyExecuteXmlReader ( возвращает XmlReader ) в моем DAL для MyExecuteXmlReader ( возвращает строку ).

Так что теперь я читаю из XmlReader вstring и вернуть эту строку вместо XmlReader, что решает проблему закрытия считывателя и соединения вне DAL.

1 голос
/ 28 июля 2011

У меня есть статический класс DataAccess со статическими методами: MyExecuteReader (возвращает sqldatareader) и MyExecuteXmlReader (возвращает XmlReader).

Это страшно. Только прочитав это предложение, я должен сказать, что использование статических методов для таких вещей кажется просто неправильным. Я бы просто положился на пул соединений ADO.NET и обернул соединения в операторы using. Утилизация их не закрывает соединение физически. Он просто возвращает его в пул соединений для повторного использования.

Но поскольку вы пошли по этому пути (используя статические соединения и прочее, сделав свой код полностью тестируемым на модуле недружественным образом), все, что я могу вам предложить, это заключить как минимум вызовы этого XmlReader в using операторы, чтобы хотя бы гарантировать что вы освободите базовые дескрипторы или у вас будет плохая утечка, что в многопоточных приложениях может иметь катастрофические последствия.

0 голосов
/ 28 июля 2011

DataReader читает одну строку за раз, поддерживая соединение занятым.

XmlReader считывает результат за один раз и не поддерживает соединение занятым. Поэтому нет необходимости закрывать его.

0 голосов
/ 28 июля 2011

Реализуйте , используя оператор . Примером может быть:

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

0 голосов
/ 28 июля 2011

вот способ использования больше

[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();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...