簡體   English   中英

從數據庫表寫入文本文件的最快方法是什么?

[英]What is the fastest way to write to a text file from a database table?

我有數據分析應用程序,我需要能夠使用c#將數據庫表導出到分隔的文本文件。 由於應用程序體系結構,必須將該數據引入c#應用程序。 不能使用數據庫導出功能。 表的大小可以從幾列到幾百行到~100列到超過一百萬行。

根據意見進一步澄清 -

我有一個Windows服務作為數據訪問層,將從表示層獲取導出請求。 導出完成后,服務將需要將導出作為流對象傳遞回表示層(可以是WPF應用程序或Silverlight應用程序)。 然后,將為用戶提供保存或打開導出的選項。

最快的方法是什么?

謝謝

嗯,首先,如果它不是必須使用c#,則sql管理控制台能夠完成這樣的任務。

為了實現最佳的性能,我會為消費者 - 生產者2線程概念,

  • 一個線程將是讀者,負責從數據庫中讀取項目 - 在這種情況下,我強烈建議使用IReader讀取值,並將它們放在一個cuncurrent隊列中。
  • 另一個是將只使用fileStream從隊列中寫入數據的編寫者。

你也可以通過分頁方式閱讀信息來獲得更高的性能,也就是說,如果你知道你將擁有100000條記錄,將其分成1000塊,讓讀者從數據庫中讀取這些塊並將它們放入隊列。

雖然后面的解決方案更復雜,但它允許您以最佳方式利用CPU並避免延遲。

如果您使用的是SQL Server 2008(或可能是2005),則可以右鍵單擊數據庫並選擇“任務 - >導出數據”。 選擇數據庫作為輸入,並選擇“平面文件目標”作為輸出。 指定文件名,指定雙引號作為文本限定符,單擊“下一步”幾次,然后就完成了。 您甚至可以將任務保存為可以再次運行的SSIS包。

這樣做是在封面下使用SSIS。 它具有非常高的性能,因為它在管道中使用多個線程。

我會看一下使用SQLBulkCopy對象。

如果你真的需要使用C#,最快的方法是使用ADO.NET的DataReader,它是只讀的,只有前向的,可能適合你。 只要注意空字段,它處理得不好,如果你需要處理它們,也許其他ADO.NET資源對你來說會更有趣。

如果您需要快速查詢數據,可以在一個或多個線程中使用“Firehose”游標,直接從數據庫中讀取。

var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["connstr"].ToString());
var sqlDataAdapter = new SqlDataAdapter("select * from tnm_story_status", sqlConnection); sqlConnection.Open();
var dataSet = new DataSet();
sqlDataAdapter.Fill(dataSet); sqlConnection.Close();
var dataTable = dataSet.Tables[0];
var streamWriter = new StreamWriter(@"C:\\db.txt", false);
var sb = new StringBuilder();
for (var col = 0; col < dataTable.Columns.Count; col++)
{
if (sb.ToString() != "") sb.Append(",");
sb.Append(dataTable.Columns[col].ColumnName);
}
streamWriter.WriteLine(sb.ToString());
sb.Remove(0, sb.ToString().Length);
for (var row = 0; row < dataTable.Rows.Count; row++ )
{
for (var col = 0; col < dataTable.Columns.Count; col++)
{
if (sb.ToString() != "") sb.Append(",");
sb.Append(dataTable.Rows[row][col].ToString());
}
streamWriter.WriteLine(sb.ToString());
sb.Remove(0, sb.ToString().Length);
}
streamWriter.Close();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM