2015-11-05 79 views
0

我試圖從MS Access中導入一些數據到文本文件。 Access數據庫有3列。學生姓名,作業名稱和標記得分。但是,當我做下面的代碼中的數據是這樣的:從MS Access導入數據到文本文件

 
John Cena 
John Cena Assignment Submission System 
JohnCenaMNUAssignment Submission System75 
JohnCenaMNUAssignment Submission System75 
Mark 
MarkGussing Game 
MarkGussing Game80 
MarkGussing Game80 

我想有學生姓名,分配名稱和商標之間打進一些空間。此外還有兩個學生信息之間的額外線路。這是我試過的代碼,但它沒有給出想要的結果:

Private Sub DataTableToTXT() 

    Dim connetionString As String 
    Dim cnn As OleDbConnection 
    connetionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=.\\reportcard.accdb;Persist Security Info=False" 
    cnn = New OleDbConnection(connetionString) 

    Dim dtResult As New DataTable 
    cnn.Open() 
    'Change the query 
    Dim dataAdap As New OleDbDataAdapter("SELECT * FROM reports", cnn) 
    dataAdap.Fill(dtResult) 
    cnn.Close() 

    'Change the path to your desired path 
    Dim exportPath As String = "D:" 
    Dim exportFileName As String = "data.txt" 



    Dim writer As New StreamWriter(exportPath + exportFileName) 
    Try 
     Dim sb As New StringBuilder 

     For Each row As DataRow In dtResult.Rows 
      sb = New StringBuilder 
      For Each col As DataColumn In dtResult.Columns 
       sb.Append(row(col.ColumnName)) 
       writer.WriteLine(sb.ToString()) 
      Next 
      writer.WriteLine(sb.ToString()) 
     Next 
    Catch ex As Exception 
     Throw ex 
    Finally 
     If Not writer Is Nothing Then writer.Close() 
    End Try 

End Sub 
+0

不要盲目地追加讀取到字符串生成器的DB數據。檢查數據並根據需要添加空格,或者如果累積的文本全部爲空格或空格,則不寫一行。我不確定後者會如何發生,因爲這意味着一個空的DB行。 – Plutonix

回答

2

您應該刪除內部循環內的WriteLine。當你在列上循環時,該行將逐行打印StringBuilder的內容。您只需要一個的WriteLine你已經完成了內部循環

Dim writer As New StreamWriter(exportPath + exportFileName) 
Try 
    Dim sb As StringBuilder 

    For Each row As DataRow In dtResult.Rows 
     sb = New StringBuilder 
     For Each col As DataColumn In dtResult.Columns 
      sb.Append(row(col.ColumnName)) 
      sb.Append(" ") ' The space between columns values 
      ' REMOVE this line 
      ' writer.WriteLine(sb.ToString()) 
     Next 
     writer.WriteLine(sb.ToString()) 
    Next 

但是,如果你的表不包含太多的數據,你可以避免寫在每一行線和積累所有輸出StringBuilder的因爲你訪問文件系統只是一個時間,而不是n次(其中n是行數)寫在循環結束一切就行

Dim sb As New StringBuilder 

    For Each row As DataRow In dtResult.Rows 
     For Each col As DataColumn In dtResult.Columns 
      sb.Append(row(col.ColumnName)) 
      sb.Append(" ") 
     Next 
     sb.AppendLine() 
    Next 

    ' Just one write at the end of the rows loop 
    writer.WriteLine(sb.ToString()) 

這也應該會更快。當然,如果行數很少,真正的好處可以忽略不計。

最後,最好的方法可能是使用string.JoinItemArray屬性。這將刪除列中的內部循環,並且它更清晰

Dim sb As New StringBuilder 

    For Each row As DataRow In dtResult.Rows 
     sb.AppendLine(string.Join(" ", row.ItemArray)) 
    Next 
    writer.WriteLine(sb.ToString()) 
+0

非常感謝...... –

+0

無論如何,我可以在學生姓名,作業名稱和標記之間放入相等數量的空間。所以它看起來像3列。 –