c# - 在 C# 中调用多个 "SQL DataReader"的正确方法是什么?

标签 c# sql database linq

我调用 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/

相关文章:

c# - 如何绑定(bind)剑道网格

c# - 使用单独控制台的多线程控制台应用程序

mysql - 在 MySQL 中同时运行多个创建触发器

database - Firebird 使用 isql 从一个数据库复制

php - 使用 PHP 显示在线用户列表

c# - Xamarin 从 2.5 更新到 3.5 后,Xamarin.Forms.Platform.Android 不存在

mysql - 在 MySQL 中无限运行的 INSERT

SQL Azure 无法识别我的聚集索引

java - 如何将秒表 JavaScript 中的数据存储到 MySQL

c# - C# 动态加载数据表到 JS 数组