You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
4.4 KiB
99 lines
4.4 KiB
|
2 months ago
|
using System;
|
||
|
|
using System.Data.SqlClient;
|
||
|
|
using System.Threading.Tasks;
|
||
|
|
using leak_test_project.Models;
|
||
|
|
|
||
|
|
namespace leak_test_project.Services
|
||
|
|
{
|
||
|
|
/// <summary>
|
||
|
|
/// EOL 검사 데이터를 MSSQL 데이터베이스에 저장하는 서비스 클래스.
|
||
|
|
/// </summary>
|
||
|
|
public class EolDatabaseService
|
||
|
|
{
|
||
|
|
private readonly string _connectionString;
|
||
|
|
|
||
|
|
public EolDatabaseService(string connectionString)
|
||
|
|
{
|
||
|
|
_connectionString = connectionString;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// EOL 검사 결과를 데이터베이스에 저장합니다. (동일 ID 존재 시 업데이트, 미존재 시 삽입)
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="inspectData">검사 결과 데이터</param>
|
||
|
|
public async Task SaveEolDataAsync(InspectData inspectData)
|
||
|
|
{
|
||
|
|
if (inspectData == null) return;
|
||
|
|
|
||
|
|
// MSSQL MERGE 문을 사용한 UPSERT 처리
|
||
|
|
const string query = @"
|
||
|
|
MERGE INTO [dbo].[EOL] AS Target
|
||
|
|
USING (SELECT @ID AS ID) AS Source
|
||
|
|
ON (Target.ID = Source.ID)
|
||
|
|
WHEN MATCHED THEN
|
||
|
|
UPDATE SET
|
||
|
|
Target.Channel = @Channel,
|
||
|
|
Target.SpecUL = @SpecUL,
|
||
|
|
Target.SpecLL = @SpecLL,
|
||
|
|
Target.LeakValue = @LeakValue,
|
||
|
|
Target.Result = @Result,
|
||
|
|
Target.InspectDate = @InspectDate,
|
||
|
|
Target.InspectTime = @InspectTime
|
||
|
|
WHEN NOT MATCHED THEN
|
||
|
|
INSERT ([ID], [Channel], [SpecUL], [SpecLL], [LeakValue], [Result], [InspectDate], [InspectTime])
|
||
|
|
VALUES (@ID, @Channel, @SpecUL, @SpecLL, @LeakValue, @Result, @InspectDate, @InspectTime);";
|
||
|
|
|
||
|
|
try
|
||
|
|
{
|
||
|
|
using (var conn = new SqlConnection(_connectionString))
|
||
|
|
{
|
||
|
|
using (var cmd = new SqlCommand(query, conn))
|
||
|
|
{
|
||
|
|
cmd.Parameters.AddWithValue("@ID", string.IsNullOrEmpty(inspectData.ProductId) ? "-" : inspectData.ProductId);
|
||
|
|
cmd.Parameters.AddWithValue("@Channel", string.IsNullOrEmpty(inspectData.Channel) ? "N/A" : inspectData.Channel);
|
||
|
|
cmd.Parameters.AddWithValue("@SpecUL", string.IsNullOrEmpty(inspectData.SpecUL) ? "0.00" : inspectData.SpecUL);
|
||
|
|
cmd.Parameters.AddWithValue("@SpecLL", string.IsNullOrEmpty(inspectData.SpecLL) ? "0.00" : inspectData.SpecLL);
|
||
|
|
cmd.Parameters.AddWithValue("@LeakValue", string.IsNullOrEmpty(inspectData.MeasuredValue) ? "0.0000" : inspectData.MeasuredValue);
|
||
|
|
cmd.Parameters.AddWithValue("@Result", string.IsNullOrEmpty(inspectData.Judgment) ? "NG" : inspectData.Judgment);
|
||
|
|
cmd.Parameters.AddWithValue("@InspectDate", string.IsNullOrEmpty(inspectData.InspectDate) ? DateTime.Now.ToString("yyyy-MM-dd") : inspectData.InspectDate);
|
||
|
|
cmd.Parameters.AddWithValue("@InspectTime", string.IsNullOrEmpty(inspectData.InspectTime) ? DateTime.Now.ToString("HH:mm:ss") : inspectData.InspectTime);
|
||
|
|
|
||
|
|
await conn.OpenAsync();
|
||
|
|
await cmd.ExecuteNonQueryAsync();
|
||
|
|
Console.WriteLine($"[DB SUCCESS] EOL Data saved/updated for ID: {inspectData.ProductId}");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch (Exception ex)
|
||
|
|
{
|
||
|
|
// 실시간 검사 공정 루프 흐름이 DB 커넥션 예외로 중단되지 않도록 예외 격리 처리
|
||
|
|
Console.WriteLine($"[DB ERROR] Failed to upsert EOL Data: {ex.Message}");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 데이터베이스 연결 상태를 비동기로 확인합니다.
|
||
|
|
/// </summary>
|
||
|
|
/// <returns>연결 성공 시 true, 실패 시 false</returns>
|
||
|
|
public async Task<bool> CheckConnectionAsync()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
var builder = new SqlConnectionStringBuilder(_connectionString)
|
||
|
|
{
|
||
|
|
ConnectTimeout = 2
|
||
|
|
};
|
||
|
|
using (var conn = new SqlConnection(builder.ConnectionString))
|
||
|
|
{
|
||
|
|
await conn.OpenAsync();
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|