chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore - 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
This commit is contained in:
@@ -0,0 +1,321 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using Microsoft.Data.Sqlite;
|
||||
using 報到系統客戶端.Data;
|
||||
using 報到系統客戶端.Data.Models;
|
||||
|
||||
namespace 報到系統客戶端.Data.Repositories
|
||||
{
|
||||
/// <summary>
|
||||
/// Classes 本地資料庫操作類別
|
||||
/// </summary>
|
||||
public class ClassesRepository
|
||||
{
|
||||
private readonly DatabaseService _dbService;
|
||||
|
||||
public ClassesRepository()
|
||||
{
|
||||
_dbService = DatabaseService.Instance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 新增一筆 Classes 資料
|
||||
/// </summary>
|
||||
public int Insert(LocalClassesItem item)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = @"
|
||||
INSERT INTO Classes
|
||||
(ID, CourseCode, CourseName, CourseDate, CourseLocation, NotificationTemplate, AgreedTerms, StartTime, EndTime, CreatedAt, UpdatedAt)
|
||||
VALUES (@ID, @CourseCode, @CourseName, @CourseDate, @CourseLocation, @NotificationTemplate, @AgreedTerms, @StartTime, @EndTime, @CreatedAt, @UpdatedAt)
|
||||
";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@ID", item.ID);
|
||||
cmd.Parameters.AddWithValue("@CourseCode", item.CourseCode ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CourseName", item.CourseName ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CourseDate", item.CourseDate ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CourseLocation", item.CourseLocation ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@NotificationTemplate", item.NotificationTemplate ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@AgreedTerms", item.AgreedTerms ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@StartTime", item.StartTime ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@EndTime", item.EndTime ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CreatedAt", DateTime.Now);
|
||||
cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
// 返回傳入的 ID
|
||||
return item.ID;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"新增 Classes 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新一筆 Classes 資料
|
||||
/// </summary>
|
||||
public bool Update(LocalClassesItem item)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = @"
|
||||
UPDATE Classes SET
|
||||
CourseCode = @CourseCode,
|
||||
CourseName = @CourseName,
|
||||
CourseDate = @CourseDate,
|
||||
CourseLocation = @CourseLocation,
|
||||
NotificationTemplate = @NotificationTemplate,
|
||||
AgreedTerms = @AgreedTerms,
|
||||
StartTime = @StartTime,
|
||||
EndTime = @EndTime,
|
||||
UpdatedAt = @UpdatedAt
|
||||
WHERE ID = @ID
|
||||
";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@ID", item.ID);
|
||||
cmd.Parameters.AddWithValue("@CourseCode", item.CourseCode ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CourseName", item.CourseName ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CourseDate", item.CourseDate ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CourseLocation", item.CourseLocation ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@NotificationTemplate", item.NotificationTemplate ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@AgreedTerms", item.AgreedTerms ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@StartTime", item.StartTime ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@EndTime", item.EndTime ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now);
|
||||
|
||||
return cmd.ExecuteNonQuery() > 0;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"更新 Classes 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 刪除一筆 Classes 資料
|
||||
/// </summary>
|
||||
public bool Delete(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "DELETE FROM Classes WHERE ID = @ID";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@ID", id);
|
||||
return cmd.ExecuteNonQuery() > 0;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"刪除 Classes 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查詢所有 Classes 資料
|
||||
/// </summary>
|
||||
public List<LocalClassesItem> GetAll()
|
||||
{
|
||||
return Query("SELECT * FROM Classes ORDER BY ID");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查詢單筆 Classes 資料
|
||||
/// </summary>
|
||||
public LocalClassesItem GetById(int id)
|
||||
{
|
||||
var result = Query($"SELECT * FROM Classes WHERE ID = {id}");
|
||||
return result.Count > 0 ? result[0] : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 條件查詢 Classes 資料(分頁)
|
||||
/// </summary>
|
||||
public List<LocalClassesItem> GetByCondition(int pageIndex, int pageSize, string courseName = "", string courseCode = "", DateTime? startDate = null, DateTime? endDate = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT * FROM Classes WHERE 1=1";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(courseCode))
|
||||
sql += " AND CourseCode LIKE '%' || @CourseCode || '%'";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(courseName))
|
||||
sql += " AND CourseName LIKE '%' || @CourseName || '%'";
|
||||
|
||||
if (startDate.HasValue && endDate.HasValue)
|
||||
sql += " AND CourseDate >= @StartDate AND CourseDate <= @EndDate";
|
||||
else if (startDate.HasValue)
|
||||
sql += " AND CourseDate >= @StartDate";
|
||||
else if (endDate.HasValue)
|
||||
sql += " AND CourseDate <= @EndDate";
|
||||
|
||||
sql += " ORDER BY CourseDate DESC LIMIT @PageSize OFFSET @Offset";
|
||||
|
||||
List<LocalClassesItem> result = new List<LocalClassesItem>();
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(courseCode))
|
||||
cmd.Parameters.AddWithValue("@CourseCode", courseCode);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(courseName))
|
||||
cmd.Parameters.AddWithValue("@CourseName", courseName);
|
||||
|
||||
if (startDate.HasValue)
|
||||
cmd.Parameters.AddWithValue("@StartDate", startDate.Value);
|
||||
|
||||
if (endDate.HasValue)
|
||||
cmd.Parameters.AddWithValue("@EndDate", endDate.Value);
|
||||
|
||||
cmd.Parameters.AddWithValue("@PageSize", pageSize);
|
||||
cmd.Parameters.AddWithValue("@Offset", (pageIndex - 1) * pageSize);
|
||||
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(ReadClassesItem(reader));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"查詢 Classes 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查詢 Classes 資料總數
|
||||
/// </summary>
|
||||
public int GetCount(string courseName = "", string courseCode = "", DateTime? startDate = null, DateTime? endDate = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT COUNT(*) FROM Classes WHERE 1=1";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(courseCode))
|
||||
sql += " AND CourseCode LIKE '%' || @CourseCode || '%'";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(courseName))
|
||||
sql += " AND CourseName LIKE '%' || @CourseName || '%'";
|
||||
|
||||
if (startDate.HasValue && endDate.HasValue)
|
||||
sql += " AND CourseDate >= @StartDate AND CourseDate <= @EndDate";
|
||||
else if (startDate.HasValue)
|
||||
sql += " AND CourseDate >= @StartDate";
|
||||
else if (endDate.HasValue)
|
||||
sql += " AND CourseDate <= @EndDate";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(courseCode))
|
||||
cmd.Parameters.AddWithValue("@CourseCode", courseCode);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(courseName))
|
||||
cmd.Parameters.AddWithValue("@CourseName", courseName);
|
||||
|
||||
if (startDate.HasValue)
|
||||
cmd.Parameters.AddWithValue("@StartDate", startDate.Value);
|
||||
|
||||
if (endDate.HasValue)
|
||||
cmd.Parameters.AddWithValue("@EndDate", endDate.Value);
|
||||
|
||||
return Convert.ToInt32(cmd.ExecuteScalar());
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"統計 Classes 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除所有 Classes 資料
|
||||
/// </summary>
|
||||
public void DeleteAll()
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
using (SqliteCommand cmd = new SqliteCommand("DELETE FROM Classes", conn))
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"清除 Classes 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 私用方法 - 執行查詢
|
||||
/// </summary>
|
||||
private List<LocalClassesItem> Query(string sql)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
List<LocalClassesItem> result = new List<LocalClassesItem>();
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(ReadClassesItem(reader));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"查詢 Classes 失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 私用方法 - 讀取資料列
|
||||
/// </summary>
|
||||
private LocalClassesItem ReadClassesItem(SqliteDataReader reader)
|
||||
{
|
||||
return new LocalClassesItem
|
||||
{
|
||||
ID = reader.GetInt32(reader.GetOrdinal("ID")),
|
||||
CourseCode = reader.IsDBNull(reader.GetOrdinal("CourseCode")) ? null : reader.GetString(reader.GetOrdinal("CourseCode")),
|
||||
CourseName = reader.IsDBNull(reader.GetOrdinal("CourseName")) ? null : reader.GetString(reader.GetOrdinal("CourseName")),
|
||||
CourseDate = reader.IsDBNull(reader.GetOrdinal("CourseDate")) ? null : reader.GetString(reader.GetOrdinal("CourseDate")),
|
||||
CourseLocation = reader.IsDBNull(reader.GetOrdinal("CourseLocation")) ? null : reader.GetString(reader.GetOrdinal("CourseLocation")),
|
||||
NotificationTemplate = reader.IsDBNull(reader.GetOrdinal("NotificationTemplate")) ? null : reader.GetString(reader.GetOrdinal("NotificationTemplate")),
|
||||
AgreedTerms = reader.IsDBNull(reader.GetOrdinal("AgreedTerms")) ? null : reader.GetString(reader.GetOrdinal("AgreedTerms")),
|
||||
StartTime = reader.IsDBNull(reader.GetOrdinal("StartTime")) ? null : reader.GetString(reader.GetOrdinal("StartTime")),
|
||||
EndTime = reader.IsDBNull(reader.GetOrdinal("EndTime")) ? null : reader.GetString(reader.GetOrdinal("EndTime")),
|
||||
CreatedAt = reader.GetDateTime(reader.GetOrdinal("CreatedAt")),
|
||||
UpdatedAt = reader.GetDateTime(reader.GetOrdinal("UpdatedAt"))
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user