c# - 如何使用 FileHelpers 库将大型 SQL Server 表导出到 CSV 文件中?

标签 c# filehelpers

我希望使用 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/

相关文章:

c# - FileHelpers 有限制吗?

C# .NET 4.6.1 Entity Framework - 尽管未调用 DB.SaveChanges(),DB.MyTable.Add(...) 仍然很慢

c# - 数据表转 JSON

c# - 使用 c# 以编程方式读取 Openoffice Calc (.ods)?

c# - filehelpers - 解析可变行长度

c# - FileHelpers 库 CSV - 为什么总是从右侧的最后一列中删除一个字母?

.net - 跳过 FileHelper 中的列

c# - 如何使用 C# ASP.NET 创建聊天框和通知系统

c# - 将 DllImport 从 C# 控制台应用程序中静态类的静态成员转换为 C++ CLR 控制台应用程序的成员

c# - FileHelperEngine 构造函数 - InvalidcastException