SqlDataReader结果不符合预期

时间:2019-11-30 21:53:09

标签: c# sqldatareader

由于查询的敏感性,甚至是信息,我也无法提供确切的代码。因此,我将提供一组代表性的代码。如果我了解它为什么执行其执行方式,就可以找出问题所在。

首先,我确实得到了结果。所以我知道SQL没有任何东西。但是当通过C#运行时,它仅返回最后一行。这就是我要解决的问题。

需要

客户希望将表的所有结果(具有在其他位置管理的约束)发送到文件中。我正在用代码执行此操作,因为它是由其他应用程序执行的。

using (SqlDataReader reader = cmd.ExecuteReader())
{
   while (reader.Read())
   {
      using (writer = new StreamWriter(output))
      {
         // Some StringBuilder code gets info from the reader and appends to a string called line

         writer.WriteLine(line)

      }
   } 
}

现在,我阅读这段代码基本上是说:“好的,当您阅读行时,您将使用此StreamWriter并将每一行写到带有换行符的文件中”。

不起作用的部分-令我不满意的是-它只写了SQL结果的最后一条记录。

我添加了RecordsReturned,它给了我-1,但是在循环中完成时,我看到它返回相同的结果x记录集中的确切记录数。

我怀疑是执行此操作的ExecuteReader()步骤-已在其中读出结果。我的问题是:我的理论正确吗?如果正确,为什么?当在while循环中运行时,SqlDataReader的Read()基本上应该给我每一行以便每次执行,根据Intellisense的说法,这是事实。所以我的假设是错误的,或者我错过了一些东西。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

每次创建StreamWriter并在循环中使用该文件时,您都将覆盖该文件,因此完成后仅保留最后一个。

using (SqlDataReader reader = cmd.ExecuteReader()) {
    if(reader.HasRows) {
        using (var writer = new StreamWriter(output)) { //<-- writer created once
            while (reader.Read()) {
                // Some StringBuilder code gets info from the reader
                // and appends to a string called line

                writer.WriteLine(line);
            }
        }
    } 
}