Linq to sql(三):增删改

转载 2012年03月31日 10:20:36

示例数据库

 

字段名

字段类型

允许空

字段说明

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完成简易留言簿了。实现以下功能:

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 #666666font-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 = newGuestBookDataContext("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.PostTimedescending select gb;

        rpt_Message.DataBind();

    }

}

       前面创建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 #666666font-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 = newGuestBookDataContext("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.PostTimedescending select gb;

        rpt_Message.DataBind();

    }

    protected void rpt_Message_ItemCommand(object source, RepeaterCommandEventArgse)

    {

        if (e.CommandName == "DeleteMessage")

        {

            StreamWriter sw = new StreamWriter(Server.MapPath("log.txt"), true);

            ctx.Log = sw;

            tbGuestBook gb = ctx.tbGuestBooks.Single(b => b.ID == newGuid(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 == newGuid(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

 

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


转载原文http://www.cnblogs.com/lovecherry/archive/2007/08/16/858009.html

相关文章推荐

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

原文作者链接:http://www.cnblogs.com/lovecherry/archive/2007/08/16/858009.html示例数据库 字段名字段类型允许空字段说明IDuniquei...

LinQ to Sql 分页,增,删,改 实例

一、分页 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sende...

【linq to sql学习笔记】增、删、改

其实,学习linq之前应该先学匿名类、扩展方法、委托等等,这些东西平时工作都有用到,有时间了来仔细整理下。 从现在开始,就系统学习下linq to sql 对数据表的操作。 0.表结构(UserInf...

Linq to sql增、删、改、查

最近几个项目都是用的Linq to sql,发现省了不少存储过程,用起来也非常方便,分页也很好用,将一些简单的操作贴出来给大家分享一下,有不懂的同学可以问我。Demo实体对象 1.增加记录      ...
  • shrely
  • shrely
  • 2011年05月11日 17:42
  • 619

LINQ to SQL之增删改查

LINQ to SQL类实际上是对象化数据库对象,使得我们对数据库的操作转变为面向传统面向对象的操作。它完成了对数据库的映射,集成了很多属性和方法,我们只需要用面向对象的思路去使用这些属性和方法就能够...

简单的linq to sql 的例子 ,实现了增删改查

自己先要建立一个名为bbs的数据库里面要建立一个名为linqtoTest的表。在添加项目中添加linq to sql 类,再把资源管理器打开,新建连接,找到你建立的那个数据库。把那个表拖到那个linq...

C#Winform Linq_to_Sql 实现增删改查功能

PS: Linq_to_Sql数据查询语言为强数据类型的语言,操作的基本单位与DataSet一样都是以数据实体,所以操作数据前所有要更新的数据值都要与实体的数据类型相同。如下例中为price和typ...
  • pp_fzp
  • pp_fzp
  • 2016年02月22日 22:44
  • 1935

Linq to Xml 增删查改

LINQ to XML一个重要的特性是能够方便地修改xml树,如添加、删除、更新和复制xml文档的内容。 I.插入 使用XNode类的插入方法可以方便地向xml树添加内容: ...

LINQ to SQL语句之Join和Order By

  • 2013年12月19日 17:41
  • 14KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linq to sql(三):增删改
举报原因:
原因补充:

(最多只允许输入30个字)