我调用 ExecuteReader();
来获取数据,然后我需要通过另一个查询获取另一个数据。我的结构一直是这样的:
class SomeClass
{
public static void Main(String[] args)
{
SqlConnection sqlConn = new SqlConnection();
sqlConn.ConnectionString = "some connection string"
SqlCommand SQLCmd = new SqlCommand();
SQLCmd.CommandText = "some query";
SQLCmd.Connection = sqlConn;
sqlConn.Open();
sqlReader = SQLCmd.ExecuteReader();
while (sqlReader.Read())
{
//some stuff here
}
sqlReader.Dispose();
sqlReader.Close();
sqlConn.Close();
SQLCmd.CommandText = "another query";
sqlConn.Open();
sqlReader = SQLCmd.ExecuteReader();
while (sqlReader.Read())
{
//some other stuff here
}
sqlReader.Dispose();
sqlReader.Close();
sqlConn.Close();
}
}
它们共享相同的连接字符串。他们还能分享什么?他们可以共享相同的 sqlConn.Open();
吗?资源分配和避免错误的正确方法是什么?
顺便说一句,它按原样工作。提前致谢。
最佳答案
这就是我要写的所有内容:
class SomeClass
{
public static void Main(String[] args)
{
using (SqlConnection sqlConn = new SqlConnection("some connection string"))
{
sqlConn.Open();
using (SqlCommand comm = new SqlCommand("some query", conn))
using (var sqlReader = comm.ExecuteReader())
{
while (sqlReader.Read())
{
//some stuff here
}
}
using (SqlCommand comm = new SqlCommand("some query", conn))
using (var sqlReader = comm.ExecuteReader())
{
while (sqlReader.Read())
{
//some other stuff here
}
}
}
}
}
using
语句在 block 完成时处理项目的处置。至于共享内容,您可以在命令之间保持连接打开。
处理所有这些最重要的事情是连接,但如果一个项目是 IDisposable
,我倾向于尊重 using
语句,不管它是什么实际上在后台执行(由于它是一个实现细节,因此可能会发生变化)。
别忘了,还有Multiple Active Result Sets (as demonstrated in this answer)来自单个命令和单个读取器,您可以在其中将读取器推进到下一个结果集。
对于如何编写所有这些内容,我稍微轻率的回答是:
return connection.Query<T>(procedureName, param, commandType: CommandType.StoredProcedure);
使用 Dapper ;-)
关于c# - 在 C# 中调用多个 "SQL DataReader"的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26839260/