377 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			377 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Threading.Tasks;
 | |
| using System.Data.SqlClient;
 | |
| using System.Data;
 | |
| using AR;
 | |
| 
 | |
| namespace Project
 | |
| {
 | |
|     public static class DBHelper
 | |
|     {
 | |
|         public static SqlConnection GetConnection()
 | |
|         {
 | |
|             var cs = SETTING.Data.WMS_DB_PROD ? Properties.Settings.Default.WMS_PRD : Properties.Settings.Default.WMS_DEV;
 | |
|             return new SqlConnection(cs);
 | |
|         }
 | |
| 
 | |
|         public static object ExecuteScalar(string sql, params SqlParameter[] p)
 | |
|         {
 | |
|             var cn = GetConnection();
 | |
|             try
 | |
|             {
 | |
|                 var cmd = new SqlCommand(sql, cn);
 | |
|                 if (p != null) cmd.Parameters.AddRange(p);
 | |
|                 cn.Open();
 | |
|                 return cmd.ExecuteScalar();
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 // 예외 처리 (필요에 따라 로깅 추가)
 | |
|                 return null;
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 if (cn != null && cn.State != ConnectionState.Closed)
 | |
|                     cn.Close();
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
|         public static int ExecuteNonQuery(string sql, params SqlParameter[] p)
 | |
|         {
 | |
|             var cn = GetConnection();
 | |
|             try
 | |
|             {
 | |
|                 var cmd = new SqlCommand(sql, cn);
 | |
|                 if (p != null) cmd.Parameters.AddRange(p);
 | |
|                 cn.Open();
 | |
|                 return cmd.ExecuteNonQuery();
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 // 예외 처리 (필요에 따라 로깅 추가)
 | |
|                 return -1;
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 if (cn != null && cn.State != ConnectionState.Closed)
 | |
|                     cn.Close();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // CodeIgniter 스타일의 UPDATE 헬퍼 (Dictionary 방식)
 | |
|         public static int Update(string tableName, Dictionary<string, object> data, string whereClause = "", params SqlParameter[] whereParams)
 | |
|         {
 | |
|             if (data == null || data.Count == 0)
 | |
|                 return 0;
 | |
| 
 | |
|             var setClause = new List<string>();
 | |
|             var parameters = new List<SqlParameter>();
 | |
|             int paramIndex = 0;
 | |
| 
 | |
|             // SET 절 생성
 | |
|             foreach (var item in data)
 | |
|             {
 | |
|                 string paramName = $"@set{paramIndex}";
 | |
|                 setClause.Add($"{item.Key} = {paramName}");
 | |
|                 parameters.Add(new SqlParameter(paramName, item.Value ?? DBNull.Value));
 | |
|                 paramIndex++;
 | |
|             }
 | |
| 
 | |
|             // WHERE 절 파라미터 추가
 | |
|             if (whereParams != null)
 | |
|             {
 | |
|                 parameters.AddRange(whereParams);
 | |
|             }
 | |
| 
 | |
|             string sql = $"UPDATE {tableName} SET {string.Join(", ", setClause)}";
 | |
|             if (!string.IsNullOrEmpty(whereClause))
 | |
|             {
 | |
|                 sql += $" WHERE {whereClause}";
 | |
|             }
 | |
| 
 | |
|             return ExecuteNonQuery(sql, parameters.ToArray());
 | |
|         }
 | |
| 
 | |
|         // SqlParameter 배열 방식의 UPDATE 헬퍼
 | |
|         public static int Update(string tableName, string setClause, string whereClause = "", params SqlParameter[] parameters)
 | |
|         {
 | |
|             string sql = $"UPDATE {tableName} SET {setClause}";
 | |
|             if (!string.IsNullOrEmpty(whereClause))
 | |
|             {
 | |
|                 sql += $" WHERE {whereClause}";
 | |
|             }
 | |
| 
 | |
|             return ExecuteNonQuery(sql, parameters);
 | |
|         }
 | |
| 
 | |
| 
 | |
|         // 여러 조건을 위한 헬퍼 (Dictionary 방식)
 | |
|         public static int UpdateWhere(string tableName, Dictionary<string, object> data, Dictionary<string, object> whereConditions)
 | |
|         {
 | |
|             if (whereConditions == null || whereConditions.Count == 0)
 | |
|                 return Update(tableName, data);
 | |
| 
 | |
|             var whereClause = new List<string>();
 | |
|             var whereParams = new List<SqlParameter>();
 | |
|             int paramIndex = 0;
 | |
| 
 | |
|             foreach (var condition in whereConditions)
 | |
|             {
 | |
|                 string paramName = $"@where{paramIndex}";
 | |
|                 whereClause.Add($"{condition.Key} = {paramName}");
 | |
|                 whereParams.Add(new SqlParameter(paramName, condition.Value ?? DBNull.Value));
 | |
|                 paramIndex++;
 | |
|             }
 | |
| 
 | |
|             return Update(tableName, data, string.Join(" AND ", whereClause), whereParams.ToArray());
 | |
|         }
 | |
| 
 | |
|         public static int UpdateWhere(string tableName, string setClause, string whereColumn, object whereValue)
 | |
|         {
 | |
|             return Update(tableName, setClause, $"{whereColumn} = @whereValue", new SqlParameter("@whereValue", whereValue));
 | |
|         }
 | |
| 
 | |
|         // CodeIgniter 스타일의 DELETE 헬퍼
 | |
|         public static int Delete(string tableName, string whereClause = "", params SqlParameter[] whereParams)
 | |
|         {
 | |
|             string sql = $"DELETE FROM {tableName}";
 | |
|             if (!string.IsNullOrEmpty(whereClause))
 | |
|             {
 | |
|                 sql += $" WHERE {whereClause}";
 | |
|             }
 | |
| 
 | |
|             return ExecuteNonQuery(sql, whereParams);
 | |
|         }
 | |
| 
 | |
|         // 간단한 WHERE 조건을 위한 DELETE 헬퍼
 | |
|         public static int DeleteWhere(string tableName, string whereColumn, object whereValue)
 | |
|         {
 | |
|             return Delete(tableName, $"{whereColumn} = @whereValue", new SqlParameter("@whereValue", whereValue));
 | |
|         }
 | |
| 
 | |
|         // 여러 조건을 위한 DELETE 헬퍼 (Dictionary 방식)
 | |
|         public static int DeleteWhere(string tableName, Dictionary<string, object> whereConditions)
 | |
|         {
 | |
|             if (whereConditions == null || whereConditions.Count == 0)
 | |
|                 return Delete(tableName); // WHERE 절 없이 전체 삭제
 | |
| 
 | |
|             var whereClause = new List<string>();
 | |
|             var whereParams = new List<SqlParameter>();
 | |
|             int paramIndex = 0;
 | |
| 
 | |
|             foreach (var condition in whereConditions)
 | |
|             {
 | |
|                 string paramName = $"@where{paramIndex}";
 | |
|                 whereClause.Add($"{condition.Key} = {paramName}");
 | |
|                 whereParams.Add(new SqlParameter(paramName, condition.Value ?? DBNull.Value));
 | |
|                 paramIndex++;
 | |
|             }
 | |
| 
 | |
|             return Delete(tableName, string.Join(" AND ", whereClause), whereParams.ToArray());
 | |
|         }
 | |
| 
 | |
|         // SqlParameter 배열을 받는 DELETE 헬퍼 오버로드
 | |
|         public static int DeleteWhere(string tableName, string whereClause, params SqlParameter[] whereParams)
 | |
|         {
 | |
|             return Delete(tableName, whereClause, whereParams);
 | |
|         }
 | |
| 
 | |
|         // 테이블 전체 삭제 (TRUNCATE 대신 DELETE 사용)
 | |
|         public static int DeleteAll(string tableName)
 | |
|         {
 | |
|             return Delete(tableName);
 | |
|         }
 | |
| 
 | |
|         // CodeIgniter 스타일의 SELECT 헬퍼
 | |
|         public static DataTable Select(string tableName, string columns = "*", string whereClause = "", params SqlParameter[] whereParams)
 | |
|         {
 | |
|             string sql = $"SELECT {columns} FROM {tableName}";
 | |
|             if (!string.IsNullOrEmpty(whereClause))
 | |
|             {
 | |
|                 sql += $" WHERE {whereClause}";
 | |
|             }
 | |
| 
 | |
|             return Get(sql, whereParams);
 | |
|         }
 | |
| 
 | |
|         // 간단한 WHERE 조건을 위한 SELECT 헬퍼
 | |
|         public static DataTable SelectWhere(string tableName, string columns = "*", string whereColumn = "", object whereValue = null)
 | |
|         {
 | |
|             if (string.IsNullOrEmpty(whereColumn) || whereValue == null)
 | |
|                 return Select(tableName, columns);
 | |
| 
 | |
|             return Select(tableName, columns, $"{whereColumn} = @whereValue", new SqlParameter("@whereValue", whereValue));
 | |
|         }
 | |
| 
 | |
|         // SqlParameter 배열을 받는 SELECT 헬퍼 오버로드
 | |
|         public static DataTable SelectWhere(string tableName, string columns, string whereClause, params SqlParameter[] whereParams)
 | |
|         {
 | |
|             return Select(tableName, columns, whereClause, whereParams);
 | |
|         }
 | |
| 
 | |
|         // Dictionary로 WHERE 조건을 받는 SELECT 헬퍼 오버로드
 | |
|         public static DataTable SelectWhere(string tableName, string columns, Dictionary<string, object> whereConditions)
 | |
|         {
 | |
|             if (whereConditions == null || whereConditions.Count == 0)
 | |
|                 return Select(tableName, columns);
 | |
| 
 | |
|             var whereClause = new List<string>();
 | |
|             var whereParams = new List<SqlParameter>();
 | |
|             int paramIndex = 0;
 | |
| 
 | |
|             foreach (var condition in whereConditions)
 | |
|             {
 | |
|                 string paramName = $"@where{paramIndex}";
 | |
|                 whereClause.Add($"{condition.Key} = {paramName}");
 | |
|                 whereParams.Add(new SqlParameter(paramName, condition.Value ?? DBNull.Value));
 | |
|                 paramIndex++;
 | |
|             }
 | |
| 
 | |
|             return Select(tableName, columns, string.Join(" AND ", whereClause), whereParams.ToArray());
 | |
|         }
 | |
| 
 | |
|         // Dictionary로 WHERE 조건을 받는 SELECT 헬퍼 (기본 컬럼 *)
 | |
|         public static DataTable SelectWhere(string tableName, Dictionary<string, object> whereConditions)
 | |
|         {
 | |
|             return SelectWhere(tableName, "*", whereConditions);
 | |
|         }
 | |
| 
 | |
|         // ORDER BY가 포함된 SELECT 헬퍼
 | |
|         public static DataTable SelectOrderBy(string tableName, string columns = "*", string whereClause = "", string orderBy = "", params SqlParameter[] whereParams)
 | |
|         {
 | |
|             string sql = $"SELECT {columns} FROM {tableName}";
 | |
|             if (!string.IsNullOrEmpty(whereClause))
 | |
|             {
 | |
|                 sql += $" WHERE {whereClause}";
 | |
|             }
 | |
|             if (!string.IsNullOrEmpty(orderBy))
 | |
|             {
 | |
|                 sql += $" ORDER BY {orderBy}";
 | |
|             }
 | |
| 
 | |
|             return Get(sql, whereParams);
 | |
|         }
 | |
| 
 | |
|         // LIMIT이 포함된 SELECT 헬퍼 (TOP 사용)
 | |
|         public static DataTable SelectLimit(string tableName, int limit, string columns = "*", string whereClause = "", string orderBy = "", params SqlParameter[] whereParams)
 | |
|         {
 | |
|             string sql = $"SELECT TOP {limit} {columns} FROM {tableName}";
 | |
|             if (!string.IsNullOrEmpty(whereClause))
 | |
|             {
 | |
|                 sql += $" WHERE {whereClause}";
 | |
|             }
 | |
|             if (!string.IsNullOrEmpty(orderBy))
 | |
|             {
 | |
|                 sql += $" ORDER BY {orderBy}";
 | |
|             }
 | |
| 
 | |
|             return Get(sql, whereParams);
 | |
|         }
 | |
| 
 | |
|         public static DataRow SelectFirst(string tableName, string columns = "*", Dictionary<string, object> whereParams = null)
 | |
|         {
 | |
|             if (whereParams == null || whereParams.Count == 0)
 | |
|                 return SelectFirst(tableName, columns);
 | |
| 
 | |
|             var whereClause = new List<string>();
 | |
|             var sqlParams = new List<SqlParameter>();
 | |
|             int paramIndex = 0;
 | |
| 
 | |
|             foreach (var condition in whereParams)
 | |
|             {
 | |
|                 string paramName = $"@where{paramIndex}";
 | |
|                 whereClause.Add($"{condition.Key} = {paramName}");
 | |
|                 sqlParams.Add(new SqlParameter(paramName, condition.Value ?? DBNull.Value));
 | |
|                 paramIndex++;
 | |
|             }
 | |
| 
 | |
|             var dt = SelectLimit(tableName, 1, columns, string.Join(" AND ", whereClause), "", sqlParams.ToArray());
 | |
|             return dt.Rows.Count > 0 ? dt.Rows[0] : null;
 | |
|         }
 | |
|         // 단일 행 조회 (첫 번째 행만)
 | |
|         public static DataRow SelectFirst(string tableName, string columns = "*", string whereClause = "", params SqlParameter[] whereParams)
 | |
|         {
 | |
|             var dt = SelectLimit(tableName, 1, columns, whereClause, "", whereParams);
 | |
|             return dt.Rows.Count > 0 ? dt.Rows[0] : null;
 | |
|         }
 | |
| 
 | |
|         // 단일 값 조회 (첫 번째 행의 첫 번째 컬럼)
 | |
|         public static object SelectValue(string tableName, string column, string whereClause = "", params SqlParameter[] whereParams)
 | |
|         {
 | |
|             var row = SelectFirst(tableName, column, whereClause, whereParams);
 | |
|             return row != null ? row[0] : null;
 | |
|         }
 | |
| 
 | |
|         public static T Get<T>(string sql, params SqlParameter[] p) where T : DataTable
 | |
|         {
 | |
|             var dt = (T)Activator.CreateInstance(typeof(T));
 | |
|             var cn = GetConnection();
 | |
|             try
 | |
|             {
 | |
|                 var cmd = new SqlCommand(sql, cn);
 | |
|                 if (p != null) cmd.Parameters.AddRange(p);
 | |
|                 var da = new SqlDataAdapter(cmd);
 | |
|                 da.Fill(dt);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
| 
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 if (cn != null && cn.State != ConnectionState.Closed)
 | |
|                     cn.Close();
 | |
|             }
 | |
|             return dt;
 | |
|         }
 | |
|         public static DataTable Get(string sql, params SqlParameter[] p)
 | |
|         {
 | |
|             var dt = new DataTable();
 | |
|             var cn = GetConnection();
 | |
|             try
 | |
|             {
 | |
|                 var cmd = new SqlCommand(sql, cn);
 | |
|                 if (p != null) cmd.Parameters.AddRange(p);
 | |
|                 var da = new SqlDataAdapter(cmd);
 | |
|                 da.Fill(dt);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
| 
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 if (cn != null && cn.State != ConnectionState.Closed)
 | |
|                     cn.Close();
 | |
|             }
 | |
| 
 | |
|             return dt;
 | |
|         }
 | |
|         public static void Fill(string sql, DataTable dt, params SqlParameter[] p)
 | |
|         {
 | |
|             var cn = GetConnection();
 | |
|             try
 | |
|             {
 | |
|                 var cmd = new SqlCommand(sql, cn);
 | |
|                 if (p != null) cmd.Parameters.Add(p);
 | |
|                 var da = new SqlDataAdapter(cmd);
 | |
|                 dt = new DataTable();
 | |
|                 da.Fill(dt);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
| 
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 if (cn != null && cn.State != ConnectionState.Closed)
 | |
|                     cn.Close();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | 
