从数据库表写入文本文件的最快方法是什么?

时间:2010-02-18 18:49:07

标签: c# performance

我有数据分析应用程序,我需要能够使用c#将数据库表导出到分隔的文本文件。由于应用程序体系结构,必须将该数据引入c#应用程序。不能使用数据库导出功能。表的大小可以从几列到几百行到~100列到超过一百万行。

根据评论进一步澄清 -

我有一个Windows服务作为数据访问层,它将从表示层获取导出请求。导出完成后,服务将需要将导出作为流对象传递回表示层(可以是WPF应用程序或Silverlight应用程序)。然后,用户将获得保存或打开导出的选项。

最快的方法是什么?

由于

7 个答案:

答案 0 :(得分:6)

嗯,首先,如果不是必须使用c#,那么sql管理控制台就能完成这样的任务。

为了实现最佳的性能,我将为您提供消费者 - 生产者2线程概念,

  • 一个帖子就是读者, 负责阅读物品 数据库 - 在这种情况下我非常高兴 建议使用IReader读取 这些值,并将它们放在一个cuncurrent队列中。
  • 另一个将是简单地使用fileStream从队列中写入数据的作者。

通过以分页的方式阅读信息,您也可以获得更高的性能,也就是说,如果您知道您将拥有100000条记录,则将其分配给1000块,让读者从数据库中读取这些块并放入他们在队列中。

虽然后面的解决方案更复杂,但它可以让您以最佳方式利用CPU,避免延迟。

答案 1 :(得分:3)

答案 2 :(得分:2)

如果您使用的是SQL Server 2008(或可能是2005),则可以右键单击数据库并选择“任务 - >导出数据”。选择数据库作为输入,并选择“平面文件目标”作为输出。指定文件名,指定双引号作为文本限定符,单击“下一步”几次,然后就完成了。您甚至可以将任务保存为可以再次运行的SSIS包。

这样做可以使用SSIS。它具有非常高的性能,因为它在管道中使用多个线程。

答案 3 :(得分:1)

我会考虑使用SQLBulkCopy对象。

答案 4 :(得分:0)

如果你真的需要使用C#,最快的方法是使用ADO.NET的DataReader,它是只读的,只有前向的,可能很适合你。请注意空字段,它处理得不好,如果你需要处理它们,也许其他ADO.NET资源对你来说会更有趣。

答案 5 :(得分:0)

如果您需要快速查询数据,可以在一个或多个线程中使用“Firehose”游标,直接从数据库中读取。

答案 6 :(得分:0)

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();