2016-07-14 24 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