2016-07-14 53 views
0

我使用CsvWriter将数据从SQL Server中的表导出,并有两个问题:CsvWrite不出口小桌子

  1. 当表很小,即有几个行(我测试过1行和5行),CsvWriter不导出任何东西(空文件)

  2. 当表有足够的行触发导出时,它会截断行。在我的测试中,导出30行表时得到21行,导出50行表时得到44行(最后一行在两种情况下都不完整)。

加载测试数据

DECLARE @cnt INT = 0; 
DECLARE @rows INT = 1; /* I tested 5, 30 and 50 */ 

WHILE @cnt < @rows 
BEGIN 
    INSERT INTO csvtest(id, a, b) VALUES(NEWID(), @cnt, 'a very very1 very2 very3 very4 long random string'); 
    SET @cnt = @cnt + 1; 
END; 

C#代码SQL Server代码导出数据(或多或少在https://joshclose.github.io/CsvHelper/代码的副本)

// open a database connection 
SqlConnection con = new SqlConnection(cs); 
con.Open(); 

string sqlstring = "SELECT * FROM csvTest"; 
SqlCommand cmd = new SqlCommand(sqlstring, con); 
SqlDataReader dr = cmd.ExecuteReader(); 

var csv = new CsvWriter(new StreamWriter("c:\\tmp\\csvtest_1row.csv")); 

while (dr.Read()) 
{ 
    for (var i = 0; i < dr.FieldCount; i++) 
    { 
      csv.WriteField(dr[i]); 
    } 
    csv.NextRecord(); 
} 
con.Close(); 

我CsvHelper版本是2.15.0.2。

有两点需要注意:

  1. 我调试一行行的代码,可以确认上述数据从数据库中正确读取。其实,我查看CSV对象,似乎数据在那里。不知何故,他们没有正确写入文件。

  2. 我的代码应该是通用的导出任何表。

谁能告诉我我做错了什么?

在此先感谢您的帮助。

回答

0

您必须关闭StreamWriter,明确地或“使用{...}”。否则它不会刷新缓冲区,所以文件的尾部会丢失。

+0

谢谢。这解决了我的问题。 – james800