我有数据分析应用程序,我需要能够使用c#将数据库表导出到分隔的文本文件。由于应用程序体系结构,必须将该数据引入c#应用程序。不能使用数据库导出功能。表的大小可以从几列到几百行到~100列到超过一百万行。
根据评论进一步澄清 -
我有一个Windows服务作为数据访问层,它将从表示层获取导出请求。导出完成后,服务将需要将导出作为流对象传递回表示层(可以是WPF应用程序或Silverlight应用程序)。然后,用户将获得保存或打开导出的选项。
最快的方法是什么?
由于
答案 0 :(得分:6)
为了实现最佳的性能,我将为您提供消费者 - 生产者2线程概念,
通过以分页的方式阅读信息,您也可以获得更高的性能,也就是说,如果您知道您将拥有100000条记录,则将其分配给1000块,让读者从数据库中读取这些块并放入他们在队列中。
虽然后面的解决方案更复杂,但它可以让您以最佳方式利用CPU,避免延迟。
答案 1 :(得分:3)
for SQL Server:使用BCP
答案 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();