📝

CSVや固定長ファイルをSQL Serverに簡単・高速に取り込むためのライブラリー「SqlBulkCopier」をリリースしました

2025/02/13に公開

CSVや固定長ファイルをSQL Serverに簡単・高速に取り込むためのライブラリー「SqlBulkCopier」をリリースしました。

私の長年の業務システム経験を詰め込んだライブラリーなので、ぜひ見てってください!とくにマルチバイトに対応した固定長処理ライブラリーは目ぼしいものが無いと思いますのでお勧めです。

概要

SqlBulkCopierは、SQL Serverの高速なバルクコピー機能であるSqlBulkCopyを、CSVファイルおよび固定長ファイルでより扱いやすくするためのライブラリです。大量データの取り込みを効率化し、使いやすい設定手段(appsettings.jsonおよびFluent API)を提供します。

特徴

  • 高速処理: SQL ServerのSqlBulkCopyを活用した高性能なデータ転送
  • ファイル形式対応: CSVファイルと固定長ファイルの両対応
  • 柔軟な設定方法: appsettings.json と Fluent API(またはAPI)の2種類の設定手段
  • 多言語対応: マルチバイト文字やUTFの結合文字に対応
  • 柔軟性: CSVファイルや固定長ファイルの無関係な列や行の変更に影響を受けない設計

使用例

下記に、固定長ファイルの取込をappsettings.jsonの定義にしたがって取り込む場合の実装例を紹介します。

詳細は公式ドキュメントを参照ください。

Microsoft.Extensions.Hostingを使用してGeneric Hostに対応したコンソールアプリケーションを構築する例となります。

このライブラリは、.NET 8.0 または .NET Framework 4.8が必要です。NuGetから以下のパッケージをインストールしてください:

Install-Package SqlBulkCopier.FixedLength.Hosting

appsettings.json

下記が設定例になります。

取込先への接続情報、テーブル、取込の際に固定長のどの領域を、どのように取り込むのか定義します。

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=.;Initial Catalog=SqlBulkCopier;Integrated Security=True;Trust Server Certificate=True"
  },
  "SqlBulkCopier1": {
    "DestinationTableName": "[dbo].[Customer]",
    "TruncateBeforeBulkInsert": true,
    "DefaultColumnSettings": {
      "TrimMode": "TrimEnd",
      "TreatEmptyStringAsNull": true
    },
    "Columns": {
      "CustomerId": { "Start": 0, "Length": 10 },
      "FirstName": { "Start": 10, "Length": 50 },
      "LastName": { "Start": 60, "Length": 50 },
      "BirthDate": {
        "Start": 590,
        "Length": 10,
        "SqlDbType": "Date",
        "Format": "yyyy-MM-dd"
      },
      "IsActive": { "Start": 727, "Length": 1, "SqlDbType": "Bit" }
    }
  }
}

Program.cs

コンソールアプリケーションの起動処理です。必要に応じてDIなどの設定を追記してください。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Sample.FixedLength.FromAppSettings;
using SqlBulkCopier.FixedLength.Hosting;

var builder = Host.CreateApplicationBuilder(args);

builder.Configuration
    .SetBasePath(AppContext.BaseDirectory)
    .AddJsonFile("appsettings.json");

builder.Services
    .AddHostedService<FixedLengthBulkCopyService>()
    .AddSqlBulkCopier();

await builder
    .Build()
    .RunAsync();

FixedLengthBulkCopyService.cs

取込処理のロジック部分です。非常に簡潔に利用できることが見て取れるかと思います。

using System.Text;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using SqlBulkCopier.Hosting;

namespace Sample.FixedLength.FromAppSettings;

public class FixedLengthBulkCopyService(
    IConfiguration configuration,
    IBulkCopierProvider bulkCopierProvider,
    IHostApplicationLifetime applicationLifetime) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // Provide the bulk copier
        var bulkCopier = bulkCopierProvider
            .Provide("SqlBulkCopier1", configuration.GetConnectionString("DefaultConnection")!);
        
        // Write data to the database using the bulk copier
        await using var stream = File.OpenRead(
            Path.Combine(AppContext.BaseDirectory, "Assets", "Customer.dat"));

        // Bulk copy to the database
        await bulkCopier.WriteToServerAsync(stream, new UTF8Encoding(false), TimeSpan.FromMinutes(30));

        // Stop the application when the task is completed
        applicationLifetime.StopApplication();
    }
}

まとめ

大量データの取込は、多くのシステムで似たような機能がありつつも、個別に実装していることが多いと思います。

もしマッチするようであれば、ぜひご利用ください!

Discussion