如果我想在不同的表上运行多个 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();
多谢。
您可以对每个连接使用相同的连接,只要您不尝试从不同线程在同一连接上同时执行多个查询即可。
至于数据读取器,您实际上并没有重复使用读取器,每次调用ExecuteReader
返回新阅读器的新实例,您所重用的只是维护对阅读器的引用的变量。这里存在一个问题,您只是显式关闭最后一个读取器,并让第一个读取器稍后进行 GC。
您也可以重复使用该命令,但请记住,如果您提供参数等,您将需要清除它们以用于下一个查询,除非它们也适用于下一个查询。
你应该使用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
Note: GetTheConnection
只是一个占位符函数,适用于您用来获取连接实例的任何机制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)