【问题标题】:Streaming data to .csv not showing results C#将数据流式传输到 .csv 不显示结果 C#
【发布时间】:2019-05-15 01:37:27
【问题描述】:

我正在尝试将数据从 SQLServer DB 流式传输到 .CSV 文件;但是,执行后,.csv 仍然是空白的。第一个 while 循环是/曾经用于正确执行的测试目的。我知道我在流媒体部分做错了。

非常感谢任何帮助!

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection conn = new SqlConnection("Server=*******;Database=*********;Integrated Security=true");
            conn.Open();
            SqlCommand cmd = new SqlCommand("SELECT p.cFName, p.cLName, s.cSugTitle, s.cEcrno, g.cName, h.mNotes, u.UserID, u.NetworkID FROM people p INNER JOIN suggest s ON p.cidPeople = s.cidPeople_WhoEntered INNER JOIN Grp g on s.cidGrp = g.cidGrp INNER JOIN history h ON h.cidSuggest = s.cidSuggest INNER JOIN users u ON u.cidPeople = p.cidPeople", conn);
            SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}", reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), reader.GetString(4), reader.IsDBNull(5) ? null : reader.GetString(5), reader.GetString(6), reader.IsDBNull(7) ? null : reader.GetString(7));
        }


        String path = @"C:\Users\AEEVANS\Desktop\example.csv";

        using (StreamWriter sr = File.AppendText(path))
        {
            while (reader.Read())
            {
                sr.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}", reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), reader.GetString(4), reader.IsDBNull(5) ? null : reader.GetString(5), reader.GetString(6), reader.IsDBNull(7) ? null : reader.GetString(7));
                sr.Close();
            }  
        }
        Console.ReadKey();

        reader.Close();
        conn.Close();

        if (Debugger.IsAttached)
        {
            Console.ReadLine();
        }
    }
  }
}

编辑 我已经编辑了我的原始代码,不包括每个推荐的第一个 while 循环。我现在遇到以下错误:

System.ObjectDisposedException: '无法写入已关闭的 TextWriter。'

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection conn = new SqlConnection("Server=********;Database=*********;Integrated Security=true");
            conn.Open();
            SqlCommand cmd = new SqlCommand("SELECT p.cFName, p.cLName, s.cSugTitle, s.cEcrno, g.cName, h.mNotes, u.UserID, u.NetworkID FROM people p INNER JOIN suggest s ON p.cidPeople = s.cidPeople_WhoEntered INNER JOIN Grp g on s.cidGrp = g.cidGrp INNER JOIN history h ON h.cidSuggest = s.cidSuggest INNER JOIN users u ON u.cidPeople = p.cidPeople", conn);
            SqlDataReader reader = cmd.ExecuteReader();

            String path = @"C:\Users\AEEVANS\Desktop\example.csv";

            using (StreamWriter sr = File.AppendText(path))
            {
                while (reader.Read())
                {
                    sr.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}", reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), reader.GetString(4), reader.IsDBNull(5) ? null : reader.GetString(5), reader.GetString(6), reader.IsDBNull(7) ? null : reader.GetString(7));
                    sr.Close();
                }
            }

            reader.Close();
            conn.Close();

            if (Debugger.IsAttached)
            {
                Console.ReadLine();
            }

        }
        }
    }

【问题讨论】:

  • 在您的第一个循环(reader.Read() 之后,阅读器处于 EOF。这就是为什么您的第二个循环不执行任何操作。摆脱第一个循环。您还应该包装连接,命令和阅读器使用块。
  • 同时关闭循环内的 Streamwriter 将使您的文件中只有一条记录。如果您有更多记录,您将永远看不到它们,而当您尝试写入关闭的流时,将在第二个循环中引发异常

标签: c# sql-server streamwriter data-stream


【解决方案1】:

while (reader.Read()) 是通过数据阅读器的单程旅行。如果您再执行一次while (reader.Read()),您将一无所获,因为指针已经位于阅读器内容的末尾。

看起来您应该能够将两个 while (reader.Read()) 块合并为一个。

【讨论】:

  • 我根据推荐删除了我的第一个 while 循环。我现在收到以下错误:System.ObjectDisposedException: 'Cannot write to a closed TextWriter.'
  • 在我的sr.WriteLine()之后;
  • 那是因为史蒂夫在他的评论中所说的。您需要在 while (reader.Read()) 块之后移动 sr.Close
  • 不知道我是怎么错过的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2011-07-17
相关资源
最近更新 更多