LINQ对数据库的CRUD操作

本文介绍了如何使用LINQ对数据库进行CRUD操作,包括创建表tb_GuestBook,利用VS2008建立网站解决方案LinqCRUD,并通过DataClasses1.dbml映射数据库表。接着,展示了如何实现留言簿的功能,如发表、查看、回复和删除留言。
摘要由CSDN通过智能技术生成

第一:创建表留言表tb_GuestBook,代码如下:

CREATE TABLE dbo.tb_GuestBook(
 [ID] uniqueidentifier primary key,
 [UserName] [nvarchar](50),
 [PostTime] [datetime] NULL,
 [Message] [nvarchar](500),
 [IsReplied] [bit] NULL,
 [Reply] [nvarchar],
)

 

第二,利用VS2008新建一个网站解决方案,命名为:LinqCRUD。

     (关键)建立实体类方法:

      1.添加一个新项,DataClasses1.dbml,命名为:GuestBook.dbml。

      2.在VS2008左上角添加数据库db_Test,然后将表 tb_GuestBook 拖入到  GuestBook.dbml的设计页面中,保存。

    

     打开GuestBook.designer.cs可以发现系统自动创建了GuestBook数据库中tbGuestBook表的映射。

 

第三,

简易留言簿

       现在,我们就可以使用Linq to sql完成简易留言簿了。实现以下功能:

l         发表留言(增)

l         查看留言(查)

l         管理员回复留言(改)

l         管理员删除留言(删除)

首先,创建一个Default.aspx,在页面上加入一些控件:

  1. <div>
  2.     
  3.         姓名:<asp:TextBox ID="tb_UserName" runat="server"></asp:TextBox>
  4.         <br />
  5.         <br />
  6.         留言:<asp:TextBox ID="tb_Message" runat="server" TextMode="MultiLine" 
  7.             Width="435px"></asp:TextBox>
  8.         <br />
  9.         <br />
  10.         <asp:Button ID="btn_SendMessage" runat="server" onclick="btn_SendMessage_Click" 
  11.             Text="发表留言" />
  12.         <br />
  13.         <br />
  14.         <asp:Repeater ID="Repeater1" runat="server" >
  15.           <ItemTemplate >
  16.               <table width="600px" style="border:solid 1px #666666; font-size:10pt; background-color:#f0f0f0">
  17.             <tr>
  18.             <td align="left" style ="width :400px">
  19.             <%# Eval("Message")%>
  20.             </td>
  21.             <td align="right" style ="width :200px">
  22.             <%# Eval("PostTime")%> - <%# Eval("UserName")%>
  23.             </td>
  24.             </tr>
  25.             <tr>
  26.             <td colspan="2" align="right">
  27.             <hr style ="width :300px" />
  28.             管理员回复:<%# Eval("IsReplied").ToString() == "False" ? "暂无" : Eval("Reply")%>
  29.             </td>
  30.             </tr>           
  31.         </table>
  32.         <br/>
  33.           </ItemTemplate>
  34.         </asp:Repeater>
  35.         <br />
  36.         <br />
  37.     
  38.     </div>

 很难想像,使用Linq to sql进行数据访问会是这么简单,Default.aspx后台代码如下:

  1. using System.Xml.Linq;
  2. using System.Data.Linq;
  3. namespace LinqCRUD
  4. {
  5.     public partial class _Default : System.Web.UI.Page
  6.     {
  7.         private const string connStr = "Data Source=(local);User Id=sa;Password=server;Initial Catalog=db_Test;";
  8.         GuestBookDataContext ctx = new GuestBookDataContext(connStr);
  9.         protected void Page_Load(object sender, EventArgs e)
  10.         {
  11.             SetBind();
  12.         }
  13.         /// <summary>
  14.         /// 绑定Repeater的数据
  15.         /// </summary>
  16.         private void SetBind()
  17.         {
  18.             Repeater1.DataSource = from gb in ctx.tb_GuestBooks orderby gb.PostTime descending select gb;
  19.             Repeater1.DataBind();
  20.         }
  21.         protected void btn_SendMessage_Click(object sender, EventArgs e)
  22.         {
  23.             //创建表的实例
  24.             tb_GuestBook gb = new tb_GuestBook();
  25.             gb.ID = Guid.NewGuid();
  26.             gb.UserName = tb_UserName.Text;
  27.             gb.Message = tb_Message.Text;
  28.             gb.IsReplied = false;
  29.             gb.PostTime = DateTime.Now;
  30.             ctx.tb_GuestBooks.InsertOnSubmit(gb);
  31.             ctx.SubmitChanges();
  32.             SetBind();
  33.         }
  34.     }
  35. }

 

运行效果如下图:

 
然后,再创建一个Admin.aspx,前台代码如下:
  1. <div>
  2.         <asp:Repeater ID="Repeater1" runat="server" 
  3.             onitemcommand="Repeater1_ItemCommand">
  4.           <ItemTemplate >
  5.             <table style =" width :600px; border :solid 1px #666666; font-size :10pt; background-color :#f0f0f0;">
  6.                <tr>
  7.                 <td align ="left"  style ="width :400px">
  8.                   <%#Eval("Message") %>
  9.                 </td>
  10.                 <td align ="right" style ="width :200px">
  11.                   <%#Eval ("PostTime") %>-<%#Eval("UserName") %>
  12.                 </td>
  13.                </tr>
  14.                <tr>
  15.                 <td colspan ="2" align ="right" >
  16.                   <hr style ="width :300px" />
  17.                   <asp:Button ID ="btn_DeleteMessage" runat ="server" Text="删除留言" CommandName ="DeleteMessage" CommandArgument ='<%#Eval("ID") %>' />
  18.                   管理员回复:<asp:TextBox runat ="server" ID ="tb_Reply" TextMode ="MultiLine" Width ="300px" Text ='<%#Eval("Reply") %>' />
  19.                   <asp:Button runat ="server" ID ="btn_SendReply" Text ="发表回复" CommandName ="SendReply" CommandArgument ='<%#Eval("ID") %>' />
  20.                 </td>
  21.                </tr>
  22.             </table>
  23.             <br />
  24.           </ItemTemplate>
  25.         </asp:Repeater>
  26.     </div>

 

 后台代码:

 

  1. using System.Data.Linq;
  2. using System.IO;
  3. namespace LinqCRUD
  4. {
  5.     public partial class Admin : System.Web.UI.Page
  6.     {
  7.         private const string connStr = "Data Source=(local);User Id=sa;Password=server;Initial Catalog=db_Test;";
  8.         //创建强类型DataContext对象
  9.         GuestBookDataContext ctx = new GuestBookDataContext(connStr);
  10.         protected void Page_Load(object sender, EventArgs e)
  11.         {
  12.             if (!Page.IsPostBack)
  13.             {
  14.                 SetBind();
  15.             }
  16.         }
  17.         /// <summary>
  18.         /// 绑定数据
  19.         /// </summary>
  20.         private void SetBind()
  21.         {
  22.             Repeater1.DataSource = from gb in ctx.tb_GuestBooks orderby gb.PostTime descending select gb;
  23.             Repeater1.DataBind();
  24.         }
  25.         protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
  26.         {
  27.             if (e.CommandName == "DeleteMessage")
  28.             {
  29.                 //记录日志
  30.                 StreamWriter sw = new StreamWriter(Server.MapPath("log.txt"), true);
  31.                 ctx.Log = sw;
  32.                 //删除回复
  33.                 tb_GuestBook gb = ctx.tb_GuestBooks.Single(b => b.ID == new Guid(e.CommandArgument .ToString ()));
  34.                 ctx.tb_GuestBooks.DeleteOnSubmit(gb);
  35.                 ctx.SubmitChanges();
  36.                 SetBind();
  37.                 sw.Close();
  38.             }
  39.             if (e.CommandName == "SendReply")
  40.             {
  41.                 //记录日志
  42.                 StreamWriter sw = new StreamWriter(Server.MapPath("log.txt"), true);
  43.                 ctx.Log = sw;
  44.                 //管理员回复
  45.                 tb_GuestBook gb = ctx.tb_GuestBooks.Single(b => b.ID == new Guid(e.CommandArgument.ToString()));
  46.                 gb.Reply = ((TextBox)e.Item.FindControl("tb_Reply")).Text;
  47.                 gb.IsReplied = true;
  48.                 ctx.SubmitChanges();
  49.                 SetBind();
  50.                 Response.Write("<script>alert('回复成功')</script>");
  51.                 sw.Close();
  52.             }
  53.         }
  54.     }
  55. }

 

运行效果如下图:

 

在这里,我们通过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

   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值