首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC/MFC 圖書管理系統:歸還功能未實現、借書日期寫入錯誤、罰金計算異常

     編輯:程式設計綜合問答

問題拆解

  1. 借書後無法歸還:代碼中**缺少「歸還」按鈕處理函數**,或函數體為空。需實作:查詢借閱記錄 → 更新歸還日期 → 計算超期天數 → 更新罰金 → 修改圖書狀態為「可借」。
  2. 借書日期正常,歸還日期未寫入資料庫:借書時只寫 `BORROW_DATE`,`RETURN_DATE` 欄位留空(正確)。**歸還時**必須 `UPDATE BORROW SET RETURN_DATE = GETDATE() WHERE ...`。若借書時就寫了歸還日期,邏輯顛倒。
  3. 罰金計算錯誤:罰金 = `MAX(0, DATEDIFF(day, BORROW_DATE, RETURN_DATE) - 允許天數) * 單日罰金`。檢查:`RETURN_DATE` 是否為 NULL(未歸還)、日期格式、時區、資料型別。

建議修復步驟

  1. **補全歸還功能**:在對話框/視圖加入「歸還」按鈕 → `OnReturnBook()` → 彈出選擇借閱記錄對話框 → 確認後執行更新 SQL。
  2. **檢查資料表結構**:`BORROW` 表需欄位 `BORROW_DATE` (datetime), `RETURN_DATE` (datetime, nullable), `FINE` (money/decimal)。
  3. **統一日期處理**:資料庫用 `GETDATE()` / `SYSDATETIME()`,C++ 用 `CTime::GetCurrentTime()`,避免字串拼接日期(格式/注入風險)。
  4. **事務包裹**:借書/歸還涉及多表(借閱記錄、圖書狀態、讀者罰金),用 `CDatabase::BeginTrans()` / `CommitTrans()` 保證一致性。

代碼片段參考

void CLibraryDlg::OnReturnBook() {
    // 1. 取得選中借閱記錄 ID
    long borrowId = GetSelectedBorrowId();
    if (borrowId <= 0) return;

    // 2. 計算罰金
    CTime borrowDate = GetBorrowDate(borrowId);
    CTime returnDate = CTime::GetCurrentTime();
    int overdueDays = max(0, (returnDate - borrowDate).GetDays() - MAX_BORROW_DAYS);
    double fine = overdueDays * DAILY_FINE;

    // 3. 事務更新
    CDatabase db; db.OpenEx(dsn);
    db.BeginTrans();
    try {
        db.ExecuteSQL(_T("UPDATE BORROW SET RETURN_DATE = GETDATE(), FINE = ") + fine + _T(" WHERE ID = ") + borrowId);
        db.ExecuteSQL(_T("UPDATE BOOK SET STATUS = '可借' WHERE BOOK_ID = (SELECT BOOK_ID FROM BORROW WHERE ID = ") + borrowId + _T(")"));
        db.CommitTrans();
        AfxMessageBox(_T("歸還成功,罰金: ") + fine);
    } catch (CDBException* e) {
        db.RollbackTrans();
        e->ReportError(); e->Delete();
    }
    db.Close();
}

總結

歸還功能缺失 = 代碼未寫;日期/罰金錯 = 邏輯/事務/欄位處理不當。補全 `OnReturnBook`、統一日期型別、加事務、驗證罰金公式,系統即可閉環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved