繁体   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