Files
HLib/Exchange/CsvDbSyncUxer.cs
T
2026-06-01 13:23:34 +09:00

154 lines
6.3 KiB
C#

using KssSmaPlaLib.Commons;
using KssSmaPlaLib.IO.Database;
using KssSmaPlaLib.IO.File;
using Org.BouncyCastle.Asn1.X509;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace KssSmaPlaLib.Exchange
{
public static class CsvDbSyncUxer
{
private const string INI_KEY_INSERT_PROCESSING_MODE = "InsertProcessingMode";
private const string INI_VALUE_INSERT_PROCESSING_MODE_BULK = "Bulk";
private const string INI_VALUE_INSERT_PROCESSING_MODE_ROW_BY_ROW = "RowByRow";
private const string INI_KEY_SQL_NAME_INSERT_BULK = "SqlNameInsertBulk";
public static bool InsertDbFromCsvFiles(
Dictionary<string, string> iniDic,
DbUxer con,
string csvFilePath,
string dupCheckSql,
string insertSqlName,
out string resultMessage,
EncodingUxer.EncodingType encodingType = EncodingUxer.EncodingType.Utf8WithoutBom)
{
var messageForMe = string.Empty;
resultMessage = string.Empty;
var mode = DictionaryUxer.GetValueOrDefault<string, string>(
iniDic,
INI_KEY_INSERT_PROCESSING_MODE,
INI_VALUE_INSERT_PROCESSING_MODE_ROW_BY_ROW);
//if (string.IsNullOrEmpty(mode))
//{
// resultMessage = $"挿入モードが設定されていません。[キー:{INI_KEY_INSERT_PROCESSING_MODE}]";
// return false;
//}
string[] validValues = {
INI_VALUE_INSERT_PROCESSING_MODE_BULK,
INI_VALUE_INSERT_PROCESSING_MODE_ROW_BY_ROW };
mode = mode.Trim();
if (!validValues.Contains(mode, StringComparer.OrdinalIgnoreCase))
{
resultMessage = $"挿入モードの値が不正です。[{INI_KEY_INSERT_PROCESSING_MODE}:{mode}]";
return false;
}
if (mode.ToUpper() == INI_VALUE_INSERT_PROCESSING_MODE_ROW_BY_ROW.ToUpper())
{
// 1行ずつ挿入(従来方式)
// CSV読み込み
if (!CsvUxer.ImportFromCsv(csvFilePath, out var rs, out messageForMe, encodingType))
{
resultMessage = messageForMe;
return false;
}
LoggerUxer.Info($"[CSV件数:{rs.Count}]");
if (string.IsNullOrEmpty(dupCheckSql))
{
LoggerUxer.Info($"重複チェックSQLが未指定のため重複チェックは行いません。");
}
else
{
LoggerUxer.Info($"重複チェックを行います。[SQLファイル:{dupCheckSql}]");
}
foreach (var rec in rs)
{
var recObj = rec.ToDictionary(kvp => kvp.Key, kvp => (object)kvp.Value);
if (!string.IsNullOrEmpty(dupCheckSql))
{
// 重複チェック
if (!con.ExecuteQuery(dupCheckSql, recObj, out var dupRs, out messageForMe))
{
resultMessage = "重複チェックエラー:" + messageForMe;
return false;
}
if (dupRs.Count != 1)
{
resultMessage = $"重複チェックで取得件数エラーです。[取得件数:{dupRs.Count}]";
return false;
}
// ↓COUNT(*)の結果型はintにあらず(ポスグレの場合long)ゆえに文字列化してint化する
if (!int.TryParse(dupRs[0].Values.ElementAt(0).ToString(), out var intCnt))
{
resultMessage = $"重複チェックで取得値(件数)が数値ではありません。[取得値:{dupRs[0].Values.ElementAt(0)}]";
return false;
}
// 重複レコードありの場合、飛ばす
if (intCnt > 0)
{
LoggerUxer.Info($"重複レコードのため、飛ばします。[該当件数:{intCnt}]");
continue;
}
LoggerUxer.Info($"重複チェックにて重複レコードは見つかりませんでした。");
}
// DB挿入
if (!string.IsNullOrEmpty(insertSqlName))
{
LoggerUxer.Info($"[DB挿入SQL名:{insertSqlName}]");
if (!con.ExecuteNonQuery(insertSqlName, recObj, out var resultCount, out messageForMe))
{
resultMessage = messageForMe;
return false;
}
LoggerUxer.Info($"[DB挿入件数:{resultCount}]");
}
else
{
LoggerUxer.Info($"DB挿入SQL名が未指定のためDB挿入は行いません。");
}
}
}
else
{
// バルク挿入
LoggerUxer.Info($"バルク挿入が指定されました。");
insertSqlName = DictionaryUxer.GetValueOrDefault<string, string>(
iniDic,
INI_KEY_SQL_NAME_INSERT_BULK,
string.Empty);
if (string.IsNullOrEmpty(insertSqlName))
{
resultMessage = $"バルク挿入SQLファイル名が指定されていません。[キー:{INI_KEY_SQL_NAME_INSERT_BULK}]";
return false;
}
LoggerUxer.Info($"[DBバルク挿入SQL名:{insertSqlName}]");
if (!con.BeginTextImport(insertSqlName, csvFilePath, out var resultCount, out messageForMe))
{
resultMessage = messageForMe;
return false;
}
LoggerUxer.Info($"[DBバルク挿入件数:{resultCount}]");
}
return true;
}
}
}