我有一个带静态方法的静态DataAccess类:MyExecuteReader(返回sqldatareader)和MyExecuteXmlReader(返回XmlReader)。
现在使用ExecuteReader方法,我可以执行SqlCommand.ExecuteReader(CommandBehavior.CloseConnection),这将在我关闭阅读器时关闭连接。
SqlCommand.ExecuteXmlReader()没有类似的方法。
那么在这种情况下确保关闭相应连接的最佳方法是什么?
注意:
我的查询返回XML,即使用FOR XML AUTO。这就是我使用XmlReader的原因。返回的字段被视为SqlString。我可以使用SqlDataReader.GetSqlString方法,但我不确定这是一个好方法。
更新
我可以将XML读入字符串并从DAL返回字符串而不是XmlReader。
我知道使用声明,并且由于某些异常处理问题,我认为该选项已被排除。
答案 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();
}