2013-07-08 48 views
1

我從SQLite導出數據到.csv,但我得到了行問題,爲什麼結果總是出現在第一行?我錯過了什麼??爲什麼結果總是出現在第一行?

結果:

enter image description here

我的代碼:

private void DataExport() 
     { 
      SaveFileDialog saveFileDialog = new SaveFileDialog 
      { 
       Title = "Choose file to save to", 
       FileName = ".csv", 
       Filter = "CSV (*.csv)|*.csv", 
       FilterIndex = 0, 
       InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 
      }; 


      if (saveFileDialog.ShowDialog() == true) 
      { 
       SQLiteCommand cmd = new SQLiteCommand(); 
       String sSQL; 

       sSQL = "select * from Tile1"; 
       cmd.CommandText = sSQL; 
       clsCon.con.Open(); 
       cmd.Connection = clsCon.con; 
       SQLiteDataReader dr2; 
       dr2 = cmd.ExecuteReader(); 
       dr2.Read(); 

       DataSet _dataSet = new DataSet(); 
       DataTable _dataTable = new DataTable(); 

       for (var i = 0; i < dr2.FieldCount; i++) 
       { 
        _dataTable.Columns.Add("" + dr2.GetName(i) + "", typeof(string)); 
        _dataTable.Rows.Add("" + dr2.GetValue(i) + ""); 
       } 

       var rows = _dataTable.Rows; 

       StringBuilder sb = new StringBuilder(); 

       IEnumerable<string> columnNames = _dataTable.Columns.Cast<DataColumn>().Select(column => column.ColumnName); 
       sb.AppendLine(string.Join(",", columnNames)); 

       foreach (DataRow row in rows) 
       { 
        IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString()); 
        sb.AppendLine(string.Join(",", fields)); 
       } 

       File.WriteAllText(saveFileDialog.FileName, sb.ToString()); 

       clsCon.con.Close(); 
      } 
     } 
+5

「你爲什麼結果總是出現在第一行」的含義很不明確。請提供更多細節。 –

+0

我的意思是行的結果是不斷下降的第一行,而不是每列都有它。 – redbeef

+0

當你實際上只是將它寫入文本文件時,你已經將結果顯示爲Excel表格,這對我們沒有多大幫助。什麼文本文件看起來像? (請告訴我們你已經執行了哪些診斷,例如,你是否在調試器中通過了步驟?) –

回答

-1

儘量簡化你的代碼了一下,我指的是數據表和數據集駕駛我堅果:

private void DataExport() 
{ 
    SaveFileDialog saveFileDialog = new SaveFileDialog 
    { 
     Title = "Choose file to save to", 
     FileName = ".csv", 
     Filter = "CSV (*.csv)|*.csv", 
     FilterIndex = 0, 
     InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 
    }; 

    if (!saveFileDialog.ShowDialog()) 
    { 
     return; 
    } 

    using (var conn = new SQLiteConnection(ConnectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = "SELECT * FROM Tile1"; 
     using (var reader = cmd.ExecuteReader()) 
     using (var writer = new StreamWriter(saveFileDialog.FileName)) 
     { 
      var columnNames = Enumerable 
       .Range(0, reader.FieldCount) 
       .Select(reader.GetName); 
      string header = string.Join(", ", columnNames); 
      writer.WriteLine(header); 
      while (reader.Read()) 
      { 
       var values = Enumerable 
        .Range(0, reader.FieldCount) 
        .Select(reader.GetValue); 
       string valuesRow = string.Join(", ", values); 
       writer.WriteLine(valuesRow); 
      } 
     } 
    } 
} 
+0

這就是我需要的工作原理:D – redbeef

0

它看起來DataTable對象沒有被正確填充,請檢查這裏的部分:

for (var i = 0; i < dr2.FieldCount; i++) 
    { 
     _dataTable.Columns.Add("" + dr2.GetName(i) + "", typeof(string)); 
     _dataTable.Rows.Add("" + dr2.GetValue(i) + ""); 
    } 

我猜你試圖在這裏建立數據表中的列,但你不能在同一時間追加行,你實際上添加的第一行的每一列的值到不同的行。您生成的表格將如下所示:

 col1  col2  col3  col4 
row1 val(1,1) 
row2 val(1,2) 
row3 val(1,3) 
row4 val(1,4) 

val(x,y)表示數據庫中列y和行x的值。

@Darin Dimitrov的解決方案非常適合您的問題。

相關問題