首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 實戰入門:打造簡易留言板完整實作 CRUD

     編輯:關於.NET

前言

延續前兩篇「預備知識」與「DataContext 與實體」,本文將透過一個完整的 ASP.NET 留言板專案,示範如何利用 LINQ to SQL 輕鬆實現 Create、Read、Update、Delete 四大核心操作,並展示自動產生的 SQL 語句,讓你體會「像操作記憶體物件一樣操作資料庫」的開發體驗。

一、資料庫與實體類別建立

1.1 資料表結構

欄位名型別允許 Null說明
IDuniqueidentifier否主鍵
UserNamevarchar(50)否留言者
PostTimedatetime否留言時間
Messagevarchar(400)是內容
IsRepliedbit否是否回覆
Replyvarchar(400)是管理員回覆

1.2 使用 Visual Studio 設計器產生 .dbml

  1. 專案右鍵 → Add New Item → LINQ to SQL Classes,命名 GuestBook.dbml
  2. 開啟 Server Explorer,建立連線至 GuestBook 資料庫
  3. 將 tbGuestBook 拖曳至設計介面,Ctrl+S 儲存
  4. 系統自動產生 GuestBookDataContext 及 tbGuestBook 實體類別

DBML 設計介面

二、前台頁面:Default.aspx(一般使用者)

2.1 版面配置

  • TextBox:姓名、留言內容
  • Button:發表留言
  • Repeater:顯示留言清單,依 PostTime 遞減排序

2.2 後台核心程式碼

public partial class _Default : System.Web.UI.Page
{
    GuestBookDataContext ctx = new GuestBookDataContext(
        "server=xxx;database=GuestBook;uid=xxx;pwd=xxx");

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) SetBind();
    }

    protected void btn_SendMessage_Click(object sender, EventArgs e)
    {
        var gb = new tbGuestBook
        {
            ID = Guid.NewGuid(),
            UserName = tb_UserName.Text,
            Message = tb_Message.Text,
            IsReplied = false,
            PostTime = DateTime.Now
        };
        ctx.tbGuestBooks.Add(gb);   // 加入追蹤
        ctx.SubmitChanges();        // 送出 INSERT
        SetBind();
    }

    private void SetBind()
    {
        rpt_Message.DataSource = from gb in ctx.tbGuestBooks
                                 orderby gb.PostTime descending
                                 select gb;
        rpt_Message.DataBind();
    }
}

留言板執行畫面

三、後台管理頁:Admin.aspx(管理員)

3.1 功能區塊

  • Repeater + ItemCommand:刪除留言、發表回覆
  • 每筆資料顯示:留言內容、時間、姓名、回覆文字框

3.2 關鍵邏輯

protected void rpt_Message_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    var id = new Guid(e.CommandArgument.ToString());
    var gb = ctx.tbGuestBooks.Single(b => b.ID == id);

    if (e.CommandName == "DeleteMessage")
    {
        ctx.tbGuestBooks.Remove(gb);   // 刪除追蹤
        ctx.SubmitChanges();           // 送出 DELETE
    }
    else if (e.CommandName == "SendReply")
    {
        gb.Reply = ((TextBox)e.Item.FindControl("tb_Reply")).Text;
        gb.IsReplied = true;           // 修改屬性
        ctx.SubmitChanges();           // 送出 UPDATE
    }
    SetBind();
}

管理後台畫面

四、自動產生的 SQL 深度解析

4.1 UPDATE 語句

UPDATE [dbo].[tbGuestBook]
SET [IsReplied] = @p4, [Reply] = @p5
WHERE ([ID] = @p0) AND ([UserName] = @p1) AND ([PostTime] = @p2)
      AND ([Message] = @p3) AND (NOT ([IsReplied] = 1)) AND ([Reply] IS NULL)

LINQ to SQL 預設採用 樂觀平行存取,WHERE 條件包含所有原始欄位值,確保資料未被他人異動。

4.2 DELETE 語句

DELETE FROM [dbo].[tbGuestBook]
WHERE ([ID] = @p0) AND ([UserName] = @p1) AND ([PostTime] = @p2)
      AND ([Message] = @p3) AND (NOT ([IsReplied] = 1)) AND ([Reply] = @p4)

五、啟用 Log 除錯技巧

var sw = new StreamWriter(Server.MapPath("log.txt"), true);
ctx.Log = sw;  // 所有 SQL 寫入 log.txt
// ... 執行操作 ...
sw.Close();

輸出範例:

SELECT ... FROM [tbGuestBook] WHERE ...
-- @p0: Input Guid ...
-- Context: SqlProvider(Sql2005) Model : AttributedMetaModel Build: 3.5.20706.1

六、總結與下一步

  • 新增:`new Entity() { ... }` → `Table.Add()` → `SubmitChanges()`
  • 查詢:LINQ 查詢語法直接繫結
  • 修改:`Single()` 取得實體 → 修改屬性 → `SubmitChanges()`
  • 刪除:`Single()` 取得實體 → `Table.Remove()` → `SubmitChanges()`

下一篇將系統介紹「查詢語法」進階篇,敬請期待!

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