筆記摘要:

本視頻講述了課程管理系統中多條件動態查詢功能的實現原理與編碼步驟,包括SQL語句拼接、條件組合邏輯處理、數據封裝及UI事件聯動,並強調了整型檢索效率、空值處理細節和可擴展性設計。/n ---

 

- **效果演示:多條件組合查詢功能

  - 系統支持根據課程分類和課程名稱進行自由組合查詢。

  - 可單獨按課程名稱模糊匹配(如輸入“dnet”返回19條記錄),也可與課程分類聯合篩選(如選擇“c#”後結果縮減為2條)。

  - 查詢支持任意條件組合,具有通用性,適用於五個及以上條件的實際開發場景。

 

- **功能演示:修改與刪除操作

  - 修改操作:點擊“修改”按鈕後更改課程信息(如改為“00”),提交後頁面即時刷新,體現良好的用户體驗。

  - 刪除操作:點擊“刪除”觸發確認對話框,確認後數據立即移除,取消則不執行任何操作。

  - 三個核心功能(查詢、修改、刪除)構成完整的增刪改查模塊。

 

- **添加課程與委託技術説明

  - 添加課程通過窗體跳轉實現,需使用委託技術完成主窗體到子窗體的嵌入式跳轉。

  - 委託技術在當前預科階段可忽略,但在後續高級編程中至關重要。

 

- **實現原理概述:三層架構與動態查詢邏輯

  - 多條件動態查詢的核心在於後台對用户輸入條件的靈活組合與數據篩選。

  - 遵循三層結構開發流程:

    - 編寫數據訪問方法。

    - 實現業務邏輯方法。

    - 編寫UI層事件處理代碼。

 

- **數據訪問層實現:定義基本SQL語句

  - 查詢字段包括:課程ID、課程內容(content)、課時(class_hour)、學分(credit)、講師ID(teacher_id)以及用於修改的主鍵ID。

  - 講師姓名(teacher_name)不在當前表中,需通過內連接從講師表獲取。

  - SQL基礎語句結構:

    ```

    SELECT cos.id, cos.content, cos.class_hour, cos.credit, cos.teacher_id, t.name AS teacher_name

    FROM course cos

    INNER JOIN teacher t ON cos.teacher_id = t.id

    ```

 

- **動態條件拼接:組合查詢邏輯設計

  - 兩個查詢條件:課程分類ID(int類型)和課程名稱(string類型)。

  - 對於字符串類型,判斷是否為空或空字符串即可確定是否參與條件拼接。

  - 對於整型ID,約定傳遞 `-1` 表示“未選擇”,因數據庫中ID不可能為負值,故可用作無效標識。

  - 若存在全範圍數值可能,則應使用可空類型(如 `int?`),但本例中無需考慮。

 

- **Where條件構建策略

  - 定義一個獨立的 `whereConditions` 字符串變量用於累積所有有效條件。

  - 每個條件前加 `" AND "`,最終拼接時去除首個多餘的 `"AND"`。

  - 條件判斷使用多個 `if` 而非 `if-else`,確保各條件獨立可選。

 

- **課程名稱模糊查詢實現

  - 使用 SQL 的 `LIKE` 關鍵字實現前綴匹配。

  - 拼接格式為:`AND course_name LIKE 'dnet%'`。

  - 注意單引號包裹值並添加通配符 `%`。

 

- **完整SQL語句拼接方法

  - 將基礎查詢語句與動態生成的 `whereConditions` 拼接。

  - 去除 `whereConditions` 開頭的 `" AND "` 後, prepend `" WHERE "`。

  - 示例拼接邏輯:

    ```csharp

    string sql = "SELECT ... FROM course cos INNER JOIN teacher t ON ...";

    if (!string.IsNullOrEmpty(whereConditions))

    {

        sql += " WHERE " + whereConditions.Substring(5); // 去掉第一個

    }

    ```

 

- **執行查詢並封裝結果

  - 調用通用數據訪問類的 `GetReader` 方法執行SQL,返回 `SqlDataReader`。

  - 使用 `while (reader.Read())` 循環讀取每一條記錄。

  - 創建泛型集合 `List<Course>` 存儲結果,逐字段賦值。

  - 特別注意:讀取整型字段需強制轉換 `(int)reader["field"]`。

 

- **實體類擴展以支持關聯字段

  - 在 `Course` 實體類中新增擴展屬性 `TeacherName`,用於接收連接查詢出的講師姓名。

  - 擴展屬性不影響數據庫映射,僅用於展示層數據承載。

 

- **資源管理與方法收尾

  - 查詢結束後必須顯式關閉 `SqlDataReader`,避免資源泄漏。

  - 返回封裝好的 `List<Course>` 結果集。

  - 數據訪問方法共四步:定義基礎SQL → 組合條件 → 拼接完整語句 → 執行查詢並封裝返回。

 

- **業務邏輯層實現:方法轉發

  - 業務邏輯層無複雜處理,直接調用數據訪問層的 `QueryCourses(categoryId, courseName)` 方法。

  - 符合職責分離原則,保持業務層簡潔。

 

- **UI層事件編寫建議

  - 建議學員在完成後台編碼後,先自行嘗試編寫UI查詢事件邏輯,再與講解對比學習。

 

思維導圖:

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯

 

 

 



C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_SQL_02

 1. 課程名稱模糊查詢技術,支持單條件或組合條件查詢,適用於多種動態篩選場景,如招聘網站篩選條件。 2. 演示了修改課程信息的操作流程,包括直接在列表中修改並實時刷新展示,提升了用户體驗。 3. 展示了刪除課程記錄的確認機制,確保用户操作的準確性,避免誤刪。 4. 強調了查詢、修改和刪除功能在實際開發中的通用性和重要性,奠定了增刪改查操作的基礎。 5. 提及了添加課程功能的實現方式,通過窗體嵌入跳轉至子窗體,實現課程信息的新增,但實際操作中未詳細展開。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_SQL_03

 1. 委託技術是編程中非常重要的概念,將在後續的高級課程中進行專題講解,預科階段可以暫時忽略,但需知曉其存在與重要性。 2. 後續的系統學習與高級編程中,委託技術將頻繁使用,是未來學習與開發的一個關鍵方向,需引起重視。 3. 程序編碼實現的效果已經演示完畢,接下來將深入講解具體的編碼實現過程。 4. 瞭解並掌握委託技術,將有助於提升編程能力,尤其是在高級課程開發與複雜系統構建中發揮重要作用。 5. 學習路徑上,委託技術作為一項基礎但關鍵的技能,應儘早納入學習計劃,為未來的深入學習與實踐打下堅實基礎。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_SQL_04

 1. 首先,明確查詢實現的核心在於用户條件的輸入與後台條件組合的邏輯,這是整個流程的關鍵所在。 2. 按照三層架構的要求,第一步是編寫數據訪問方法,確保能夠從數據庫中獲取所需數據。 3. 接着,開發業務邏輯方法,用於處理數據訪問方法返回的數據,實現條件組合與數據篩選。 4. 最後,編寫UI事件,具體為查詢事件,實現用户界面與後台邏輯的交互,完成多條件查詢功能。 5. 整理並回顧之前的添加課程功能實現,為接下來的查詢課程功能開發奠定基礎。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯_05


C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_數據_06


C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯_07

 1. 在數據庫查詢中,根據實際需求選擇使用ID或name進行連接查詢,但考慮到查詢效率,建議優先使用整型ID而非字符串name,因為整型數據檢索速度更快。 2. 課程分類的ID比name更適合作為查詢條件,原因是ID為整型,而name為字符串,整型數據在檢索時效率更高。 3. 講師信息中雖然顯示的是姓名,但實際數據庫中存儲的是講師ID,講師ID與講師表關聯,因此在設計查詢時應使用ID進行關聯查詢,而非直接使用姓名。 4. 根據需求選擇查詢條件時,應充分考慮數據類型對查詢效率的影響,優先選擇效率更高的整型ID作為查詢條件。 5. 在進行數據庫設計和查詢優化時,應根據具體需求和數據特性,靈活選擇使用ID或name,同時考慮數據類型對查詢性能的影響,以達到最佳的查詢效果。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯_08


C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯_09

 1. 定義基本的SQL語句以查詢課程ID,因為ID在修改操作中至關重要,是修改操作的必要參數。 2. 查詢課程內容,包括課程的具體信息和內容描述,以便於全面瞭解課程的詳細情況。 3. 確保在查詢中包含課程ID,以便在後續的修改或操作中能夠準確地定位和處理特定課程。 4. 課程內容的獲取對於課程管理和更新非常重要,是瞭解課程詳細信息的關鍵。 5. 通過定義基本的SQL語句,可以有效地從數據庫中提取所需的課程ID和課程內容,支持課程的管理和維護工作。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_數據_10

 1. 獲取課程開頭的ID是關鍵,因為修改課程信息時仍需使用此ID,確保操作的準確性和針對性。 2. 確定講師信息的重要性,特別是teacher name,它在當前表中未直接提供,需通過內連接查詢獲取,以完整課程詳情。 3. 強調SQL語句的正確拼接,包括必要的空格,以保證查詢語句的語法正確和執行效率。 4. 討論學分和課程結束的相關信息,雖然未詳細展開,但表明了課程結構的完整性考慮。 5. 提及T恤name的查詢需求,雖非課程核心,但體現了數據關聯查詢的全面性,確保信息無遺漏。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯_11


C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_SQL_12

 1. 定義動態組合條件時,約定-1表示無值,適用於ID查詢,需確保數據庫中該ID不為-1。 2. 若數值範圍廣泛,包括負數和正數,應考慮使用可為空類型解決可能的值覆蓋問題。 3. 組合條件的SQL語句拼接需注意空格和邏輯連接詞(如AND)的正確使用,確保語句結構完整。 4. 通過單獨定義WHERE條件,動態拼接SQL語句,以適應不同的查詢需求和組合條件。 5. 使用if而非if-else結構處理多種可能條件,確保所有情況都被正確處理且不遺漏。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_數據_13

 1. 對話討論瞭如何判斷一個變量如cos name是否為空或空字符串,提到了使用None或長度為0作為判斷條件的方法。 2. 強調在特定場景下,如從文本框獲取值,cos name不會為空,因此無需進行空值判斷,以避免不必要的錯誤。 3. 討論中解釋了為何cos name不可能為空的原因,即其值來源於文本框,而文本框的默認值或用户輸入通常不會導致該變量為空。 4. 提出了兩種判斷字符串非空的方法:直接比較不等於空字符串或檢查字符串長度是否大於0。 5. 整個對話旨在澄清對於變量是否為空的判斷邏輯,以及在實際編程中如何合理應用這些判斷以避免潛在的錯誤。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_數據_14

 1. 對話強調了文本框中的數據頂多為一個空字符串,而非空對象,指出這是編程中常見的理解誤區。 2. 指出在編程實踐中,過度檢查空對象或空字符串是不必要的,應追求代碼的精簡與高效。 3. 強調了在處理文本框數據時,檢查是否為空的邏輯可以簡化,因為數據不可能為空對象。 4. 提醒學習者注意細節處理,通過具體的例子展示對編程邏輯的深入理解。 5. 總結了對話的核心觀點,即編程時應根據數據特性優化代碼邏輯,避免不必要的複雜性。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_SQL_15

 1. 在SQL查詢中,使用模糊查詢方法,如'cos name',需要在關鍵詞前後加上單引號和通配符,以實現精準匹配。 2. 對於外條件的處理,若需查詢包含特定名稱的記錄,應在名稱前後添加空格,並在查詢語句中使用LIKE操作符配合通配符進行匹配。 3. 強調了SQL模糊查詢的基本方法,即使用LIKE關鍵字和通配符,對於初學者而言,這是需要重點掌握的內容。 4. 提醒學習者,如果對SQL查詢不熟悉,應適當補充相關知識,因為後續有專門的專題講解,預科階段並未深入涉及。 5. 確認了通過上述方法,可以正確組織和執行SQL查詢,以滿足特定的查詢需求。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_SQL_16

 1. 在實際開發中,可以通過添加if判斷來處理額外的條件,以增強代碼的通用性。 2. 對於組合好的元素,接下來的步驟是將其拼接在一起,形成一個完整的結構或語句。 3. 在拼接過程中,使用等於號(=)可以將circle變量與其他部分連接,實現功能的整合。 4. 此過程並不複雜,關鍵在於理解如何將各個部分有效地結合,以達到預期的效果。 5. 通過上述方法,可以靈活地調整和擴展代碼,以適應不同的開發需求和場景。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_數據_17

 1. 通過子字符串操作去除特定字符和空格,將查詢條件與基本查詢語句結合,實現動態查詢條件的構建,這是優化SQL查詢語句的關鍵步驟。 2. 執行查詢後,使用通用數據訪問類的get reader方法獲取SQL data reader,為後續的數據處理提供數據流,確保查詢結果的準確獲取。 3. 封裝查詢結果到對象中,通過定義list集合和循環讀取數據,實現數據的結構化存儲,便於後續業務邏輯處理,這是數據處理的重要環節。 4. 在封裝對象時,注意對讀取的數據進行類型轉換,確保數據類型與對象屬性匹配,避免運行時類型錯誤,提高代碼的健壯性。 5. 整個過程展示了從查詢條件構建、數據獲取到結果封裝的完整流程,體現了數據處理的系統性和邏輯性,是數據庫操作中常見的處理模式。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_數據_18

 1. 對話中提到通過提前備課和編寫內容,確保教學過程中的步驟和信息準確無誤,體現了對教學內容的精心準備。 2. 在討論的上下文中,提及了實體類的擴展,具體為添加了teacher name屬性,這表明了對實體類功能的增強和定製化需求。 3. 通過對話可以看出,教學內容的前後部分存在關聯性,強調了知識的連貫性和擴展性,有助於學生理解和掌握新概念。 4. 提及了對TCID和提升name等概念的探討,顯示了在教學或項目討論中對具體技術細節的關注和討論。 5. 整個對話體現了團隊合作和信息核對的過程,通過一步步確認和擴展內容,確保了教學或項目實施的順利進行。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯_19


C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯_20

 1. 定義了四個核心步驟來實現基於多個查詢條件的動態組合查詢,包括課程分類編號和課程名稱的組合查詢,以封裝結果並返回,這構成了業務邏輯的基礎。 2. 在業務邏輯中,通過cost service傳遞課程ID和名稱作為查詢條件,完成了後台部分的數據訪問和業務邏輯處理,確保了數據的準確性和業務的連續性。 3. 詳細規劃了UI查詢事件的編寫,旨在優化用户界面與後端服務的交互,提升用户體驗和查詢效率,這是實現完整功能的關鍵步驟之一。 4. 強調了動態組合查詢的重要性,它能夠根據不同的條件靈活調整查詢策略,提高了系統的靈活性和響應速度,滿足了多樣化查詢需求。 5. 提及了將實現的查詢邏輯整合到業務邏輯層的具體操作,通過將查詢條件傳遞給後端服務,確保了前後端數據的同步和業務邏輯的正確執行。

C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_數據_21


C#上位機軟件:23.1 多條件動態查詢條件的編寫技巧和完整查詢方法編寫_業務邏輯_22