如果我想在不同的表运行多个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'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
是只为你使用,让您连接实例什么都机构的占位符的功能。
我一般使用的适配器,所以我对读者的细节生锈,但我认为你是在正确的轨道上。
注意:在您的代码中的一个项目是每次调用ExecuteReader
应该产生一个新的数据读取器。 您可重用变量名,而是参考现有的读者是通过在每次调用一个新的丢弃和更换。 点是,使用的ExecuteReader得到一个新之前关闭前面的阅读器。