我希望使用 C# 和 FileHelpers 库将大型 SQL Server 表导出到 CSV 文件中。
我也可以考虑 C# 和 bcp,但我认为 FileHelpers 会比 bcp 更灵活。速度不是特殊要求。
OutOfMemoryException
在运行以下代码时被 storage.ExtractRecords()
抛出(一些不太重要的代码已被省略):
SqlServerStorage storage = new SqlServerStorage(typeof(Order));
storage.ServerName = "SqlServer";
storage.DatabaseName = "SqlDataBase";
storage.SelectSql = "select * from Orders";
storage.FillRecordCallback = new FillRecordHandler(FillRecordOrder);
Order[] output = null;
output = storage.ExtractRecords() as Order[];
运行以下代码时,link.ExtractToFile()
会抛出“Timeout expired”:
SqlServerStorage storage = new SqlServerStorage(typeof(Order));
string sqlConnectionString = "Server=SqlServer;Database=SqlDataBase;Trusted_Connection=True";
storage.ConnectionString = sqlConnectionString;
storage.SelectSql = "select * from Orders";
storage.FillRecordCallback = new FillRecordHandler(FillRecordOrder);
FileDataLink link = new FileDataLink(storage);
link.FileHelperEngine.HeaderText = headerLine;
link.ExtractToFile("file.csv");
SQL 查询运行时间超过默认的 30 秒,因此超时异常。不幸的是,我在 FileHelpers 文档中找不到如何将 SQL 命令超时设置为更高的值。
我可以考虑在小数据集上循环执行 SQL 选择,直到导出整个表,但过程太复杂了。 是否有直接的方法在大型数据库表导出中使用 FileHelpers?
最佳答案
Rei Sivan 的回答是正确的,因为它可以很好地适应大文件,因为它避免了将整个表格读入内存。但是,可以清理代码。
shamp00 的解决方案需要外部库。
这是一个更简单的表格到 CSV 文件的导出器,可以很好地扩展到大文件,并且不需要任何外部库:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
public class TableDumper
{
public void DumpTableToFile(SqlConnection connection, string tableName, string destinationFile)
{
using (var command = new SqlCommand("select * from " + tableName, connection))
using (var reader = command.ExecuteReader())
using (var outFile = File.CreateText(destinationFile))
{
string[] columnNames = GetColumnNames(reader).ToArray();
int numFields = columnNames.Length;
outFile.WriteLine(string.Join(",", columnNames));
if (reader.HasRows)
{
while (reader.Read())
{
string[] columnValues =
Enumerable.Range(0, numFields)
.Select(i => reader.GetValue(i).ToString())
.Select(field => string.Concat("\"", field.Replace("\"", "\"\""), "\""))
.ToArray();
outFile.WriteLine(string.Join(",", columnValues));
}
}
}
}
private IEnumerable<string> GetColumnNames(IDataReader reader)
{
foreach (DataRow row in reader.GetSchemaTable().Rows)
{
yield return (string)row["ColumnName"];
}
}
}
我写了这段代码,并声明了它CC0 (public domain) .
关于c# - 如何使用 FileHelpers 库将大型 SQL Server 表导出到 CSV 文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19455919/