C# 的 字符串插值($) 和 逐字字符串(@) 功能

這段代碼使用了 C# 的 字符串插值($逐字字符串(@ 功能,并在 SQL 語句中動態拼接變量。下面詳細解釋它們的用法:


1. $(字符串插值)

$ 是 C# 的 字符串插值 符號,允許在字符串中直接嵌入表達式(用 {} 包裹),例如:

string name = "Alice";
string message = $"Hello, {name}!"; // 輸出:Hello, Alice!

在 SQL 語句中,$ 用于動態插入變量值,如 {level}{GetNextSortOrder(parentId)} 等。


2. @(逐字字符串)

@ 是 C# 的 逐字字符串 符號,它會:

  • 忽略轉義字符(如 \n\t 等)
  • 允許字符串跨多行(適合 SQL 語句)
  • 保留所有空格和換行

例如:

string sql = @"SELECT *FROM UsersWHERE Id = 1";

如果不加 @,換行符需要用 \n 表示,而加了 @ 后可以直接換行。


3. $@(同時使用)

$@ 結合了兩種功能:

  • @ 允許 SQL 語句跨多行
  • $ 允許在字符串中插入變量

所以:

string strsql = $@"INSERT INTO System (PID, Level, SortOrder, Name, remark, CreatedTime, ModifiedTime)VALUES (...)
";

這樣既保持了 SQL 語句的可讀性,又能動態插入變量。


4. {(level == 3 ? $"'{editForm.Target.Replace("'", "''")}'" : "NULL")} 解釋

這段代碼是一個 嵌套的三元運算符 + 字符串插值,用于動態生成 SQL 語句中的 remark 字段值:

  • level == 3:檢查當前節點是否是第 3 級(可能是菜單項)
    • 如果是,則:
      • editForm.remark.Replace("'", "''"):對 remark 字符串進行 SQL 轉義(單引號 ' 替換成 '',防止 SQL 注入)
      • $"'{...}'":用單引號包裹(因為 SQL 字符串需要用 ' 括起來)
    • 如果不是(level != 3),則直接插入 NULL(SQL 的 NULL 值,不加引號)

示例

假設:

  • level = 3
  • editForm.remark= "admin/home"

則生成的 SQL 部分:

remark= 'admin/home'

如果 level = 2,則:

remark= NULL

5. 完整 SQL 拼接示例

假設:

  • parentId = 1
  • level = 3
  • editForm.NodeName = "Admin Page"
  • editForm.remark = "admin/home"

生成的 SQL 語句:

INSERT INTO System
(PID, Level, SortOrder, Name, remark, CreatedTime, ModifiedTime)
VALUES (1,3,1,  -- 假設 GetNextSortOrder(parentId) 返回 1'Admin Page','admin/home',GETDATE(),GETDATE()
)

6. 安全性注意事項

雖然這種拼接方式方便,但存在 SQL 注入風險(如果 NodeNameTarget 等來自用戶輸入)。更安全的方式是使用 參數化查詢(如 SqlCommand.Parameters):

using (var cmd = new SqlCommand(@"INSERT INTO System (PID, Level, SortOrder, Name, remark, CreatedTime, ModifiedTime)VALUES (@PID, @Level, @SortOrder, @Name, @remark, GETDATE(), GETDATE())", connection))
{cmd.Parameters.AddWithValue("@PID", parentId ?? (object)DBNull.Value);cmd.Parameters.AddWithValue("@Level", level);cmd.Parameters.AddWithValue("@SortOrder", GetNextSortOrder(parentId));cmd.Parameters.AddWithValue("@Name", editForm.NodeName);cmd.Parameters.AddWithValue("@remark", level == 3 ? editForm.Target : (object)DBNull.Value);cmd.ExecuteNonQuery();
}

這樣可以有效防止 SQL 注入攻擊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902392.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mockMvc構建web單元測試學習筆記

web應用本來需要依靠tomcat這個環境運行 現在用mockMvc是為了模擬這個web環境,簡化測試 什么是mock(模擬) 模擬對象---mock object是以可控方式模擬真實對象行為的假對象,通過模擬輸入數據,驗證程序達到預期結果 為什么使用mock對象 因為…

6.7.圖的深度優先遍歷(英文縮寫DFS)

樹是特殊的圖,沒有回路的圖就是樹 BFS與DFS的區別在于,BFS使用了隊列,DFS使用了棧 一.深度優先遍歷: 1.樹的深度優先遍歷: 樹的深度優先遍歷分為先根遍歷和后根遍歷。 以樹的先根遍歷為例: 上述圖片里…

VOS3000內存滿了怎么刪除,錄音格式如何轉換呢

一、清理VOS3000內存(刪除舊錄音文件) 定位錄音存儲目錄 通常錄音文件存儲在以下路徑(以實際配置為準): bash 復制 下載 /usr/local/vos/record # 默認錄音目錄 /var/log/vos/logs # 系統日志目錄(…

【圖問答】DeepSeek-VL 論文閱讀筆記

《DeepSeek-VL: Towards Real-World Vision-Language Understanding》 1. 摘要/引言 基于圖片問答(Visual Question Answering,VQA)的任務 2. 模型結構 和 三段式訓練 1)使用 SigLIP 和 SAM 作為混合的vision encoder&#xf…

MATLAB - 模型預測控制(MPC)使用 ADMM 求解器四分之一汽車懸架懸掛系統動力學控制

系列文章目錄 目錄 系列文章目錄 前言 一、四分車懸架模型 二、道路干擾剖面 三、設計模型預測控制器 四、設置優化求解器 五、輔助函數 前言 本例展示了如何為四分之一汽車懸架系統設計模型預測控制器 (MPC),采用乘法交替方向法 (ADMM) 求解器來控制主動懸架…

基于多模態融合算法的航空武器毀傷評估技術方案

基于多模態融合算法的航空武器毀傷評估技術方案 1. 引言 航空武器毀傷評估(Damage Assessment, DA)是現代戰爭中的關鍵環節,直接影響后續作戰決策。傳統的人工評估方式效率低、主觀性強,且在高強度戰場環境下難以實時完成。因此,本研究提出一種基于多模態融合算法的自動…

LeetCode算法題(Go語言實現)_49

題目 給定整數數組 nums 和整數 k,請返回數組中第 k 個最大的元素。 請注意,你需要找的是數組排序后的第 k 個最大的元素,而不是第 k 個不同的元素。 你必須設計并實現時間復雜度為 O(n) 的算法解決此問題。 一、代碼實現(快速選擇…

【HCIA】簡易的兩個VLAN分別使用DHCP分配IP

前言 之前我們通過 靜態ip地址實現了Vlan間通信 ,現在我們添加一個常用的DHCP功能。 文章目錄 前言1. 配置交換機2. 接口模式3. 全局模式后記修改記錄 1. 配置交換機 首先,使用DHCP,需要先啟動DHCP服務: [Huawei]dhcp enable I…

【技術派后端篇】技術派通用敏感詞替換:原理、實現與應用

在當今互聯網環境下,數據脫敏對于國內的互聯網企業而言已經成為一項標配。這不僅是為了滿足合規性要求,更是保障用戶信息安全和企業聲譽的重要舉措。本文將深入探討技術派中實現數據脫敏的關鍵技術——通用敏感詞替換,從算法原理到具體實現&a…

Android RK356X TVSettings USB調試開關

Android RK356X TVSettings USB調試開關 平臺概述操作-打開USB調試實現源碼補充說明 平臺 RK3568 Android 11 概述 RK3568 是瑞芯微(Rockchip)推出的一款高性能處理器,支持 USB OTG(On-The-Go)和 USB Host 功能。US…

Microsoft Edge for linux debian

下載地址 https://www.microsoft.com/en-us/edge/download?formMA13FJ 安裝 # 下載安裝包 wget https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/microsoft-edge-stable_135.0.3179.85-1_amd64.deb?brandM102 # 安裝 sudo dpkg -i microsoft…

typedef MVS_API CLISTDEF0IDX(ViewScore, IIndex) ViewScoreArr;

查找 MVS_API 定義 我們沒有在 List.h 文件中找到 MVS_API 的定義。MVS_API 很可能在 MVS 庫的其他地方定義。一般來說,MVS_API 是控制 OpenMVS 庫導入導出的宏,通常會出現在 MVS 的頭文件中。為了回答這個問題,我可以提供 MVS 代碼中常見的…

5.4/Q1,GBD數據庫最新文章解讀

文章題目:The global burden of high BMI among adolescents between 1990 and 2021 DOI:10.1038/s43856-025-00838-2 中文標題:1990 年至 2021 年青少年高 BMI 的全球負擔 發表雜志:Commun Med 影響因子:1區&#xff…

【形式化驗證基礎】活躍屬性Liveness Property和安全性質(Safety Property)介紹

文章目錄 一、Liveness Property1、概念介紹2、形式化定義二、Safety Property1. 定義回顧2. 核心概念解析3. 為什么強調“有限前綴”4. 示例說明4.1 示例1:交通信號燈系統4.2 示例2:銀行賬戶管理系統5. 實際應用的意義三. 總結一、Liveness Property 1、概念介紹 在系統的…

Redis面試——常用命令

一、String (1)設置值相關命令 1.1.1 SET 功能:設置一個鍵值對,如果鍵已存在則覆蓋舊值語法: SET key value [EX seconds] [PX milliseconds] [NX|XX]EX seconds:設置鍵的過期時間為 seconds 秒 PX milli…

【Unity】使用Cinemachine+CharacterController實現第三人稱視角下的角色視角、移動和跳躍控制

1.初始配置 安裝Cinemachine插件給角色添加CharacterConroller創建Cinemachine-->Free Look Camera在Free Look Camera中調整參數,Y Axis勾選Inver,X Axis取消勾選InverFree Look Camera要看向角色 跟隨角色(自行設置,我就不…

深入理解 DML 和 DQL:SQL 數據操作與查詢全解析

深入理解 DML 和 DQL:SQL 數據操作與查詢全解析 在數據庫管理中,SQL(結構化查詢語言)是操作和查詢數據的核心工具。其中,DML(Data Manipulation Language,數據操作語言) 和 DQL&…

MongoDB數據庫的安裝到入門使用詳細講解

本篇文章主要講解MongoDB的安裝使用教程及基礎的數據庫管理和操作能力的講解,通過本篇文章您可以快速的掌握對MongDB數據庫的基本認識及,基礎開發能力。 一、MongoDB介紹 MongoDB是一款免費開源的非關系型數據庫,該數據庫適應于復雜關系的存儲和管理,非常適合數據結構復雜…

git提交實現文件或目錄忽略

前言 開發中使用git下載項目代碼開發,存在不需要提交文件或目錄,這里記錄下ideajava項目開發添加以下配置可忽略不需要提交文件,以方便我們提交代碼時,查看及提交文件只涉及項目代碼修改文件。 git提交實現文件或目錄忽略 .gitignore 文件的內容列出了在…

go語言的八股文

1.go語言觸發異常的場景有哪些 運行時錯誤 1.空指針解引用:嘗試訪問一個未初始化的指針指向的內存,會導致程序崩潰并觸發異常。 2.數組越界訪問:試圖訪問數組中不存在的索引,比如數組長度為5,卻嘗試訪問索引為10的元素…