using System; using System.Data.SqlClient; using System.Threading.Tasks; using leak_test_project.Models; namespace leak_test_project.Services { /// /// EOL 검사 데이터를 MSSQL 데이터베이스에 저장하는 서비스 클래스. /// public class EolDatabaseService { private readonly string _connectionString; public EolDatabaseService(string connectionString) { _connectionString = connectionString; } /// /// EOL 검사 결과를 데이터베이스에 저장합니다. (동일 ID 존재 시 업데이트, 미존재 시 삽입) /// /// 검사 결과 데이터 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}"); } } /// /// 데이터베이스 연결 상태를 비동기로 확인합니다. /// /// 연결 성공 시 true, 실패 시 false public async Task CheckConnectionAsync() { try { var builder = new SqlConnectionStringBuilder(_connectionString) { ConnectTimeout = 2 }; using (var conn = new SqlConnection(builder.ConnectionString)) { await conn.OpenAsync(); return true; } } catch { return false; } } } }