首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

C# 與 SQL Server 核心操作實戰:StreamReader、參數化查詢、分頁與 XML 處理

     編輯:關於SqlServer

核心類別與方法速查表

類別/方法用途關鍵屬性/方法
StreamReader文字檔讀取ReadLine(), ReadToEnd(), CurrentEncoding
StreamWriter文字檔寫入WriteLine(), Flush(), AutoFlush
SqlParameter參數化查詢防注入ParameterName, SqlDbType, Value, Direction
SqlCommand執行 SQL 命令ExecuteReader(), ExecuteNonQuery(), ExecuteScalar()
XmlDocumentXML DOM 操作InnerText(轉義), InnerXml(保留標籤), SelectNodes()

檔案流操作實戰

讀取 CSV 並寫入資料庫

using (var reader = new StreamReader("data.csv", Encoding.UTF8))
using (var conn = new SqlConnection(connStr))
{
    conn.Open();
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // 移除自增 ID 欄位(假設第一欄)
        line = Regex.Replace(line, @"^\d+,", "");
        var fields = line.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        
        if (fields.Length == 10) // 驗證欄位數
        {
            using (var cmd = new SqlCommand(
                "INSERT INTO TargetTable VALUES (@p1,@p2,...@p10)", conn))
            {
                for (int i = 0; i < 10; i++)
                    cmd.Parameters.AddWithValue($"@p{i+1}", fields[i]);
                cmd.ExecuteNonQuery();
            }
        }
    }
}

參數化查詢:防 SQL 注入的鐵律

兩種寫法對比

// 寫法一:顯式建立參數物件(推薦複雜場景)
var p1 = new SqlParameter("@username", SqlDbType.NVarChar, 50) { Value = uid };
var p2 = new SqlParameter("@password", SqlDbType.NVarChar, 50) { Value = pwd };
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);

// 寫法二:AddWithValue 簡潔語法(適用簡單場景)
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@password", pwd);

核心原則:永不拼接 SQL 字串,所有使用者輸入必須透過參數傳遞。

SQL 進階查詢技巧

交叉聯結生成測試資料

-- 生成 1-100 數字
SELECT t1.num + t2.num * 10 AS Num
FROM (SELECT 0 num UNION ALL SELECT 1 ... UNION ALL SELECT 9) t1
CROSS JOIN (SELECT 0 num UNION ALL SELECT 1 ... UNION ALL SELECT 9) t2
ORDER BY 1;

派生表與分頁查詢

-- SQL Server 2005+ ROW_NUMBER() 分頁(標準做法)
DECLARE @Page INT = 2, @PageSize INT = 10;

WITH PagedData AS (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY StuName) AS RowNum,
        *
    FROM Student
)
SELECT * FROM PagedData
WHERE RowNum BETWEEN (@Page-1)*@PageSize + 1 AND @Page*@PageSize;

C# 分頁邏輯輔助

int totalRows = GetTotalCount();
int totalPages = (int)Math.Ceiling(totalRows * 1.0 / pageSize);
lblPager.Text = $"{currentPage}/{totalPages}";

// 頁碼跳轉處理
string newText = Regex.Replace(lblPager.Text, @"^\d+/", $"{targetPage}/");

XML 操作關鍵差異

var xml = "Value < 10";
var doc = new XmlDocument();
doc.LoadXml(xml);

var node = doc.SelectSingleNode("/root/item");
Console.WriteLine(node.InnerText);  // 輸出: Value < 10 (自動解碼)
Console.WriteLine(node.InnerXml);   // 輸出: Value < 10 (保留實體)
  • InnerText:取得/設定純文字內容,自動處理實體編碼/解碼。
  • InnerXml:取得/設定原始 XML 標記內容,不進行編碼轉換。

委派與多播委派速記

// 定義委派
public delegate void LogHandler(string message);

// 多播委派鏈結
LogHandler logger = Console.WriteLine;
logger += msg => File.AppendAllText("log.txt", msg + Environment.NewLine);
logger += msg => Debug.WriteLine(msg);

// 一次調用觸發所有目標
logger("系統啟動完成");

最佳實踐清單

  1. 資料庫連線採用 using 區塊確保釋放。
  2. 大量資料匯入改用 SqlBulkCopy 提升效能。
  3. 分頁查詢優先使用 ROW_NUMBER() 或 OFFSET/FETCH (SQL 2012+)。
  4. XML 大量資料處理考慮 XmlReader 流式讀取降低記憶體壓力。
  5. 委派鏈結注意例外處理,單一目標失敗不應中斷整條鏈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved