• 一步一步学Linq to sql(三):增删改


    一.示例数据库

      在数据库中创建一个名为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 完成简易留言簿了。实现以下功能:
    • 发表留言(增)
    • 查看留言(查)
    • 管理员回复留言(改)
    • 管理员删除留言(删除)
    首先,创建一个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 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();     }   } }

       运行效果如下图:

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

       今天就到这里,下次将系统介绍查询句法。

  • 相关阅读:
    ios 中的循环引用问题及解决
    Leetcode-Maximum Depth of Binary Tree
    Leetcode-Min Stack
    Leetcode-Intersection of Two Linked Lists
    Leetcode-Binary Tree Inorder Traversal
    Leetcode-Unique Binary Search Trees II
    Leetcode-Unique Binary Search Trees
    Leetcode-binary Tree Zigzag Level Order Traversal
    Leetcode-Construct Binary Tree from inorder and preorder travesal
    Leetcode-Next Permutation
  • 原文地址:https://www.cnblogs.com/avrilliu/p/2990716.html
Copyright © 2020-2023  润新知