gpt4 book ai didi

c# - SqlConnection 和 SqlDataReader 的重用

转载 作者:可可西里 更新时间:2023-11-01 08:35:16 27 4
gpt4 key购买 nike

如果我想在不同的表上运行多个 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 block 来确保您清理资源,或者这里是对您的代码的快速更改以使用 using 语句来确保资源清理-up 即使存在阻止其余代码执行的异常。

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 只是一个占位符函数,用于表示您用来获取连接实例的任何机制。

关于c# - SqlConnection 和 SqlDataReader 的重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10146979/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com