在C#中调用多个“ SQL DataReader”的正确方法是什么?

Emr*_*car 2 c# sql linq database

我打电话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();
    }
}
Run Code Online (Sandbox Code Playgroud)

它们共享相同的连接字符串。他们还能分享什么?他们可以共享sqlConn.Open(); 吗?资源分配和避免错误的正确方法是什么?

顺便说一句,它按原样工作。提前致谢。

Ada*_*rth 5

这就是我写所有这些的方式:

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
    }
   }
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

using语句在块完成时处理项目的处置。至于共享内容,您可以在命令之间保持连接打开状态。

所有这些中最重要的事情是连接,但是using如果某项IDisposable与后台的实际操作无关,则我倾向于遵循一种声明(由于实现细节很容易更改)。

别忘了,单个命令和单个阅读器也有多个活动结果集(如本答案所示),您可以在其中将阅读器前进到下一个结果集。


对于如何编写所有这些内容,我的回答更为轻率:

 return connection.Query<T>(procedureName, param, commandType: CommandType.StoredProcedure);
Run Code Online (Sandbox Code Playgroud)

使用Dapper ;-)