Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据库表写入文本文件的最快方法是什么?_C#_Performance - Fatal编程技术网

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

C# 从数据库表写入文本文件的最快方法是什么?,c#,performance,C#,Performance,我有一个数据分析应用程序,我需要能够使用c将数据库表导出到一个带分隔符的文本文件中。由于应用程序体系结构的原因,这些数据必须带到c应用程序中。无法使用任何数据库导出功能。表的大小可以从几列和几百行到大约100列到超过一百万行不等 根据评论进一步澄清- 我有一个Windows服务作为数据访问层,它将从表示层获取导出请求。导出完成后,服务将需要将导出作为流对象传递回表示层,表示层可以是WPF应用程序或Silverlight应用程序。然后将为用户提供保存或打开导出的选项 最快的方法是什么 感谢使用SQ

我有一个数据分析应用程序,我需要能够使用c将数据库表导出到一个带分隔符的文本文件中。由于应用程序体系结构的原因,这些数据必须带到c应用程序中。无法使用任何数据库导出功能。表的大小可以从几列和几百行到大约100列到超过一百万行不等

根据评论进一步澄清-

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

最快的方法是什么


感谢使用SQL Server:使用BCP


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


这样做会在幕后使用SSI。它具有非常高的性能,因为它在一个管道中使用多个线程。

嗯,首先,如果不一定要使用c,那么sql管理控制台能够完成这样的任务

为了实现最佳性能,我建议您采用消费品生产商2线程概念

一个线程将是读者, 负责阅读来自 DB-在这种情况下,我会 建议使用IReader读取 值,并将其放入当前队列中。 另一个是编写器,它只需使用文件流从队列中写入数据。 您还可以通过分页方式读取信息来获得更高的性能,也就是说,如果您知道将有100000条记录,将其分为1000个数据块,让一个读卡器从数据库中读取这些数据块并将其放入队列中


尽管后一种解决方案更为复杂,但它将允许您以尽可能最好的方式使用CPU,并避免延迟。

如果您确实需要使用C,最快的方法是使用ADO.NET的DataReader,它是只读的,仅向前,可能非常适合您。注意空字段,它不能很好地处理,如果需要处理它们,可能其他ADO.NET资源对您来说会更有趣。

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

var sqlConnection=new SqlConnectionConfigurationManager.ConnectionStrings[connstr].ToString; var sqlDataAdapter=新的sqlDataAdapter从tnm\u story\u状态中选择*sqlConnection; sqlConnection.Open; var数据集=新数据集; sqlDataAdapter.FilldataSet; sqlConnection.Close; var dataTable=dataSet.Tables[0]; var streamWriter=newStreamWriter@C:\db.txt,false; var sb=新的StringBuilder; 对于var col=0;col

我会考虑使用对象。

谢谢,但由于体系结构的原因,我必须将数据带到c应用程序中。如果需要,您可以包装bcp并将其作为子进程执行。因此,您现在无法从C?SQL调用SSIS包,但稍后将添加不同的RDBMS。@John Saunders-应用程序可能需要通过防火墙才能访问数据库,因此在没有重大架构更改的情况下,目前没有SSIS。您认为SSIS和防火墙之间的交互是什么?无论您的C代码可以做什么来通过防火墙,您也可以在SSIS连接字符串中做任何事情。@John Saunders-也许我不理解您的建议。我有一个Windows服务作为数据访问层,它将获得导出请求。然后,服务需要将导出传递到表示层,表示层可以是WPF应用程序或Silverlight应用程序。SSI如何通过数据访问层将数据传输到表示层?@MindFold-谢谢。将该数据获取到流对象/文本文件怎么样?什么是最有效的写入方式?@Dan:只需使用连接到StreamReader的文件流即可。@Josh-谢谢你为我指出了那个类。我不能在这里使用它,但以后会很有帮助。我不是很肯定,但我看到裁判说它可以 d写入文本输出。