根据评论进一步澄清-- 我有一个Windows服务作为数据访问层,将从表示层获取导出请求。完成导出后,服务将需要将导出传回表示层,这可以是WPF应用程序或Silverlight应用程序,作为流对象。然后用户将获得保存或打开导出的选项。如何以最快的方式实现呢?谢谢。
首先,如果不必使用C#,则SQL管理控制台可以完成此任务。
为了实现最佳性能,我建议使用消费者-生产者2线程概念:
您还可以通过分页方式读取信息来实现更高的性能。也就是说,如果您知道将有100000条记录,请将其分成1000个块,让读取器从数据库中读取这些块并将它们放入队列中。
虽然后一种解决方案更加复杂,但它将允许您以最佳方式利用CPU并避免延迟。
StreamReader
的FileStream
即可。 - John Saunders如果你真正需要使用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();