|
系列文章導航:
一步一步學Linq to sql(二):DataContext與實體
示例數據庫
字段名 | 字段類型 | 允許空 | 字段說明 |
ID | uniqueidentifier |
| 表主鍵字段 |
UserName | varchar(50) |
| 留言用戶名 |
PostTime | datetime |
| 留言時間 |
Message | varchar(400) | √ | 留言內容 |
IsReplied | bit |
| 留言是否回復 |
Reply | varchar(400) | √ | 留言管理員回復 |
在數據庫中創建一個名為GuestBook的數據庫,在里面創建一個tbGuestBook的表,結構如上表。
生成實體類
右鍵點擊網站項目,選擇添加新項,然后選擇“Linq to sql Classes”,命名為GuestBook。然后打開App_Code里面的GuestBook.dbml。設計視圖上的文字提示你可以從服務器資源管理器或者攻擊箱拖動項到設計界面上來創建實體類。
那么,我們就在服務器資源管理器中創建一個指向GuestBook數據庫的數據連接,然后把tbGuestBook表拖動到GuestBook.dbml的設計視圖上,按CTRL+S保存。打開GuestBook.designer.cs可以發現系統自動創建了GuestBook數據庫中tbGuestBook表的映射,如下圖:
系列文章導航:
一步一步學Linq to sql(二):DataContext與實體
簡易留言簿
現在,我們就可以使用Linq to sql完成簡易留言簿了。實現以下功能:
l 發表留言(增)
l 查看留言(查)
l 管理員回復留言(改)
l 管理員刪除留言(刪除)
首先,創建一個Default.ASPx,在頁面上加入一些控件:
<div> 姓名 <ASP:TextBox ID="tb_UserName" runat="server"></ASP:TextBox><br /> <br /> 留言 <ASP:TextBox ID="tb_Message" runat="server" Height="100px" TextMode="MultiLine" Width="300px"></ASP:TextBox><br /> <br /> <ASP:Button ID="btn_SendMessage" runat="server" Text="發表留言" OnClick="btn_SendMessage_Click" /><br /> <br /> <ASP:Repeater ID="rpt_Message" runat="server"> <ItemTemplate> <table width="600px" style="border:solid 1px #666666; font-size:10pt; background-color:#f0f0f0"> <tr> <td align="left" width="400px"> <%# Eval("Message")%> </td> <td align="right" width="200px"> <%# Eval("PostTime")%> - <%# Eval("UserName")%> </td> </tr> <tr> <td colspan="2" align="right"> <hr width="300px" /> 管理員回復:<%# Eval("IsReplied").ToString() == "False" ? "暫無" : Eval("Reply")%> </td> </tr> </table> <br/> </ItemTemplate> </ASP:Repeater> </div> |
你可能很難想象,使用Linq to sql進行數據訪問會是這么簡單,后臺代碼:
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) { tbGuestBook gb = new tbGuestBook(); gb.ID = Guid.NewGuid(); gb.UserName = tb_UserName.Text; gb.Message = tb_Message.Text; gb.IsReplied = false; gb.PostTime = DateTime.Now; ctx.tbGuestBooks.Add(gb); ctx.SubmitChanges(); SetBind(); } private void SetBind() { rpt_Message.DataSource = from gb in ctx.tbGuestBooks orderby gb.PostTime descending select gb; rpt_Message.DataBind(); } } |
系列文章導航:
一步一步學Linq to sql(二):DataContext與實體
前面創建Linq to sql Classes的時候我們輸入名字GuestBook,系統就為我們自動創建了GuestBookDataContext(你也可以在GuestBook.Designer.cs中找到類定義)。在綁定的時候我們使用查詢句法查詢留言表中所有留言,按照發表時間倒序(天哪?這是數據訪問嗎?好像僅僅定義了一句SQL啊)。在發表留言按鈕中,我們為一個tbGuestBook賦值,然后把它加入留言表,再提交更改,就這樣完成了記錄的插入。
運行效果如下圖:
然后,再創建一個Admin.ASPx,前臺代碼如下:
<div> <ASP:Repeater ID="rpt_Message" runat="server" OnItemCommand="rpt_Message_ItemCommand"> <ItemTemplate> <table width="600px" style="border:solid 1px #666666; font-size:10pt; background-color:#f0f0f0"> <tr> <td align="left" width="400px"> <%# Eval("Message")%> </td> <td align="right" width="200px"> <%# Eval("PostTime")%> - <%# Eval("UserName")%> </td> </tr> <tr> <td colspan="2" align="right"> <hr width="300px" /> <ASP:Button ID="btn_DeleteMessage" runat="server" Text="刪除留言" CommandName="DeleteMessage" CommandArgument='<%# Eval("ID")%>'/> 管理員回復:<ASP:TextBox runat="server" ID="tb_Reply" TextMode="MultiLine" Width="300px" Text='<%# Eval("Reply")%>'/> <ASP:Button ID="btn_SendReply" runat="server" Text="發表回復" CommandName="SendReply" CommandArgument='<%# Eval("ID")%>'/> </td> </tr> </table> <br/> </ItemTemplate> </ASP:Repeater> </div> |
后臺代碼:
public partial class Admin : 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(); } }
private void SetBind() { rpt_Message.DataSource = from gb in ctx.tbGuestBooks orderby gb.PostTime descending select gb; rpt_Message.DataBind(); } protected void rpt_Message_ItemCommand(object source, RepeaterCommandEventArgs e) { if (e.CommandName == "DeleteMessage") { StreamWriter sw = new StreamWriter(Server.MapPath("log.txt"), true); ctx.Log = sw; tbGuestBook gb = ctx.tbGuestBooks.Single(b => b.ID == new Guid(e.CommandArgument.ToString())); ctx.tbGuestBooks.Remove(gb); ctx.SubmitChanges(); SetBind(); sw.Close(); } if (e.CommandName == "SendReply") { StreamWriter sw = new StreamWriter(Server.MapPath("log.txt"), true); ctx.Log = sw; tbGuestBook gb = ctx.tbGuestBooks.Single(b => b.ID == new Guid(e.CommandArgument.ToString())); gb.Reply = ((TextBox)e.Item.FindControl("tb_Reply")).Text; gb.IsReplied = true; ctx.SubmitChanges(); SetBind(); sw.Close(); } } } |
系列文章導航:
一步一步學Linq to sql(二):DataContext與實體
運行效果如下圖:
在這里,我們通過Single方法獲取一條記錄,也就是一個tbGuestBook實例,更新了一些屬性后保存也就完成了改這個操作。刪除操作更簡單,只需要從表中移除對象。你是不是覺得好像不是在操作數據庫,像在操作內存中的對象。
由于寫了日志,看看改和刪操作會是怎么樣的SQL?
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) -- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [00000000-0000-0000-0000-000000000000] -- @p1: Input String (Size = 4; Prec = 0; Scale = 0) [ghgh] -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [2007-8-16 10:20:09] -- @p3: Input String (Size = 3; Prec = 0; Scale = 0) [ghj] -- @p4: Input Boolean (Size = 0; Prec = 0; Scale = 0) [True] -- @p5: Input String (Size = 3; Prec = 0; Scale = 0) [qqq] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
DELETE FROM [dbo].[tbGuestBook] WHERE ([ID] = @p0) AND ([UserName] = @p1) AND ([PostTime] = @p2) AND ([Message] = @p3) AND (NOT ([IsReplied] = 1)) AND ([Reply] = @p4) -- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [158ec941-13ff-4093-bd8b-9fceae152171] -- @p1: Input String (Size = 2; Prec = 0; Scale = 0) [44] -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [2007-8-16 9:56:19] -- @p3: Input String (Size = 2; Prec = 0; Scale = 0) [44] -- @p4: Input String (Size = 3; Prec = 0; Scale = 0) [222] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1 |
今天就講到這里,下次將系統介紹查詢句法。
it知識庫:一步一步學Linq to sql(三):增刪改,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。