This repo is archived. You can view files and clone it, but cannot push or open issues or pull requests.
SXS20240115/SRC/MESAgent/AutoLoaderLib/EPIParseTemplate.cs
2024-01-15 10:57:41 +08:00

236 lines
6.3 KiB
C#

using System;
using System.Data;
using System.IO;
using iMESCore.Settings;
using Microsoft.VisualBasic;
using static iMESCore.DataBase.iMESSql;
namespace AutoLoaderLib_C
{
public abstract class EPIParseTemplate
{
// 設定暫存資料表的欄位
internal abstract bool AddColumns(DataTable dt);
// 解析資料, 並寫入暫存資料表
internal abstract bool ParsingFile(DataTable dt, string file);
// 將暫存資料表寫入資料庫
internal abstract bool InsertTable(DataTable dt);
internal IDbConnection objConnection;
public enum FileTypeEnum
{
csv = 0,
xls = 1,
dat = 2
}
private string[] wildcards = new string[] { "*.csv", "*.xls", "*.dat" };
private string strDataBaseType; // DataBase Type:oracle, mysql, access
private string strConnectionString; // Connection string
private AppSettings objSetting = new AppSettings();
private DataTable objDataTable;
private string SourcePath;
private string DestinationPath;
private string QueuePath;
private string FailPath;
/// <summary>
/// 建構子
/// </summary>
/// <param name="paramSourcePath"></param>
/// <param name="paramDestinationPath"></param>
/// <param name="paramQueuePath"></param>
/// <param name="paramFailPath"></param>
/// <remarks></remarks>
public EPIParseTemplate(string paramSourcePath, string paramDestinationPath, string paramQueuePath, string paramFailPath)
{
objSetting = new AppSettings();
// //Get database type
strDataBaseType = objSetting.GetDataBaseType();
// //Get connection string
strConnectionString = objSetting.GetConnectionString(strDataBaseType);
objConnection = CreateConnection(strConnectionString);
if (Strings.Right(paramSourcePath, 1) != @"\")
{
paramSourcePath += @"\";
}
SourcePath = paramSourcePath;
if (Strings.Right(paramDestinationPath, 1) != @"\")
{
paramDestinationPath += @"\";
}
DestinationPath = paramDestinationPath;
if (Strings.Right(paramQueuePath, 1) != @"\")
{
paramQueuePath += @"\";
}
QueuePath = paramQueuePath;
if (Strings.Right(paramFailPath, 1) != @"\")
{
paramFailPath += @"\";
}
FailPath = paramFailPath;
}
~EPIParseTemplate()
{
if (objConnection != null)
{
objConnection = null;
}
if (objSetting != null)
{
objSetting = null;
}
if (objDataTable != null)
{
objDataTable = null;
}
}
/// <summary>
/// 解析資料
/// </summary>
/// <param name="paramFileType"></param>
/// <returns></returns>
/// <remarks></remarks>
public string ParsingData(FileTypeEnum paramFileType)
{
string strResult = string.Empty;
string QueueFile = "";
string DestinationFile = "";
string FailFile = "";
try
{
objDataTable = new DataTable("RawData");
// 設定暫存資料表的欄位
if (AddColumns(objDataTable))
{
foreach (var SourceFile in Directory.GetFiles(SourcePath, wildcards[(int)paramFileType], SearchOption.TopDirectoryOnly))
{
if (File.Exists(SourceFile))
{
QueueFile = QueuePath + Path.GetFileName(SourceFile);
DestinationFile = DestinationPath + Path.GetFileName(SourceFile);
FailFile = FailPath + Path.GetFileName(SourceFile);
try
{
// 將檔案從 Source 移至 Queue
MoveFile(SourceFile, QueueFile);
objDataTable.Rows.Clear();
// 解析資料, 並寫入暫存資料表
if (ParsingFile(objDataTable, QueueFile))
{
// 將暫存資料表寫入資料庫
if (InsertTable(objDataTable))
{
// 將檔案從 Queue 移至 Destination
MoveFile(QueueFile, DestinationFile);
}
}
}
catch (Exception ex)
{
// 將檔案從 Queue 移至 Fail
MoveFile(QueueFile, FailFile);
throw;
}
}
}
strResult = "success";
}
}
catch (Exception ex)
{
strResult = "Message:" + ex.Message + ",StackTrace:" + ex.StackTrace;
}
finally
{
}
return strResult;
}
/// <summary>
/// 搬移檔案
/// </summary>
/// <param name="paramSourceFile">來源檔案</param>
/// <param name="paramTargetFile">目的檔案</param>
/// <remarks></remarks>
private void MoveFile(string paramSourceFile, string paramTargetFile)
{
try
{
// 判斷目的檔案是否已存在, 若存在必須先刪除
if (File.Exists(paramTargetFile))
{
File.Delete(paramTargetFile);
}
// 移動檔案至目的
Directory.Move(paramSourceFile, paramTargetFile);
}
catch (Exception ex)
{
throw;
}
}
}
}