示例数据库
字段名 | 字段类型 | 允许空 | 字段说明 |
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完成简易留言簿了。实现以下功能:
· 发表留言(增)
· 查看留言(查)
· 管理员回复留言(改)
· 管理员删除留言(删除)
首先,创建一个Default.aspx,在页面上加入一些控件:
<div>
姓名
<asp:TextBox ID="tb_UserName" runat="server"></asp:TextBox><br /><br />
留言
<asp:TextBox ID="tb_Message" runat="server" TextMode="MultiLine" Height="100px" Width="300px"></asp:TextBox><br /><br />
<asp:Button ID="btn_SendMessage" runat="server" Text="发表留言"
οnclick="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>
</ItemTemplate>
</asp:Repeater>
</div>
后台代码:
using System.Data.Linq;
public partial class _Default : System.Web.UI.Page
{
//数据库连接字符串
GuestBookDataContext ctx = new GuestBookDataContext("server=.;database=GuestBook;uid=sa;pwd=sa");
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SetBind();
}
}
/// <summary>
/// 绑定数据
/// </summary>
private void SetBind()
{
rpt_Message.DataSource=from gb in ctx.tbGuestBook orderby gb.PostTime descending select gb;
rpt_Message.DataBind();
}
/// <summary>
/// 发表留言
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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.tbGuestBook.InsertOnSubmit(gb);
ctx.SubmitChanges();
//重新绑定
SetBind();
}
}
前面创建Linq to sql Classes的时候我们输入名字GuestBook,系统就为我们自动创建了GuestBookDataContext(你也可以在GuestBook.Designer.cs中找到类定义)。在绑定的时候我们使用查询句法查询留言表中所有留言,按照发表时间倒序(天哪?这是数据访问吗?好像仅仅定义了一句SQL啊)。在发表留言按钮中,我们为一个tbGuestBook赋值,然后把它加入留言表,再提交更改,就这样完成了记录的插入。
<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 ID="tb_Reply" TextMode="MultiLine" Width="300px"
runat="server" Text='<%#Eval("Reply") %>'></asp:TextBox>
<asp:Button ID="btn_SendReply" runat="server" Text="发表回复"
CommandName="SendReply" CommandArgument='<%#Eval("ID") %>' />
</td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
</div>
后台代码:
using System.IO;
public partial class Admin : System.Web.UI.Page
{
//连接数据库
GuestBookDataContext ctx = new GuestBookDataContext("server=.;database=GuestBook;uid=sa;pwd=sa");
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SetBind();
}
}
/// <summary>
/// 绑定数据
/// </summary>
private void SetBind()
{
rpt_Message.DataSource = from gb in ctx.tbGuestBook 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("info.txt"), true);
//记录操作,生成日志
ctx.Log = sw;
//根据Id查询
tbGuestBook gb = ctx.tbGuestBook.Single(b => b.ID == new Guid(e.CommandArgument.ToString()));
//删除
ctx.tbGuestBook.DeleteOnSubmit(gb);
//执行
ctx.SubmitChanges();
//重新绑定
SetBind();
sw.Close();
}
//发表回复
if (e.CommandName=="SendReply")
{
StreamWriter sw=new StreamWriter(Server.MapPath("info.txt"),true);
ctx.Log = sw;
tbGuestBook gb = ctx.tbGuestBook.Single(b => b.ID == new Guid(e.CommandArgument.ToString()));
gb.Reply = (e.Item.FindControl("tb_Reply") as TextBox).Text;
gb.IsReplied = true;
ctx.SubmitChanges();
SetBind();
sw.Close();
}
}
}
在这里,我们通过Single方法获取一条记录,也就是一个tbGuestBook实例,更新了一些属性后保存也就完成了改这个操作。删除操作更简单,只需要从表中移除对象。你是不是觉得好像不是在操作数据库,像在操作内存中的对象。
SELECT [t0].[ID], [t0].[UserName], [t0].[PostTime], [t0].[Message], [t0].[IsReplied], [t0].[Reply]
FROM [dbo].[tbGuestBook] AS [t0]
WHERE [t0].[ID] = @p0
-- @p0: Input UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [1478f9d1-44d9-4460-8e88-eeced7236c45]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.18054
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 UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [1478f9d1-44d9-4460-8e88-eeced7236c45]
-- @p1: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [张三]
-- @p2: Input DateTime (Size = -1; Prec = 0; Scale = 0) [2013/7/21 0:38:23]
-- @p3: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [今天天气不错!!!]
-- @p4: Input Bit (Size = -1; Prec = 0; Scale = 0) [True]
-- @p5: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [是啊。]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.18054
SELECT [t0].[ID], [t0].[UserName], [t0].[PostTime], [t0].[Message], [t0].[IsReplied], [t0].[Reply]
FROM [dbo].[tbGuestBook] AS [t0]
ORDER BY [t0].[PostTime] DESC
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.18054
SELECT [t0].[ID], [t0].[UserName], [t0].[PostTime], [t0].[Message], [t0].[IsReplied], [t0].[Reply]
FROM [dbo].[tbGuestBook] AS [t0]
WHERE [t0].[ID] = @p0
-- @p0: Input UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [6ac1caef-ebbd-4742-8348-5b28681bb202]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.18054
DELETE FROM [dbo].[tbGuestBook] WHERE ([ID] = @p0) AND ([UserName] = @p1) AND ([PostTime] = @p2) AND ([Message] = @p3) AND (NOT ([IsReplied] = 1)) AND ([Reply] IS NULL)
-- @p0: Input UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [6ac1caef-ebbd-4742-8348-5b28681bb202]
-- @p1: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [张三]
-- @p2: Input DateTime (Size = -1; Prec = 0; Scale = 0) [2013/7/21 0:37:32]
-- @p3: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [哈哈,今天天气不错!!!]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.18054
SELECT [t0].[ID], [t0].[UserName], [t0].[PostTime], [t0].[Message], [t0].[IsReplied], [t0].[Reply]
FROM [dbo].[tbGuestBook] AS [t0]
ORDER BY [t0].[PostTime] DESC
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.18054