LINQ调用存储过程更新数据

  本小节介绍使用存储过程查询操作数据的方法。

  下面的代码实例在LinqDBDataContext类中创建Pr_UpdateCategoryOrder()方法。该方法将调用Pr_UpdateCategoryOrder存储过程对Category表中的记录进行排序。其中,iD参数指定被移动记录的ID值,moveFlag参数指定记录被移动的方向,它的值可以为“up”或者“down”。

[Function(Name="dbo.Pr_UpdateCategoryOrder")]
public int Pr_UpdateCategoryOrder([Parameter(Name="ID", DbType="Int")] System.Nullable<int> iD,
[Parameter(Name="MoveFlag", DbType="VarChar(20)")] string moveFlag)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())),
iD, moveFlag);
return ((int)(result.ReturnValue));
}

  上述的Pr_UpdateCategoryOrder()方法调用了Pr_UpdateCategoryOrder存储过程,该存储过程Category表中的记录进行排序,它的程序代码如下:

CREATE PROCEDURE [dbo].[Pr_UpdateCategoryOrder]
(
@ID int,
@MoveFlag varchar(20)

)
AS
DECLARE @UpdateOrder int
DECLARE @ParentID int
SET @UpdateOrder =(SELECT ShowOrder FROM Category WHERE ID = @ID)

SET @ParentID =(SELECT ParentID FROM Category WHERE ID = @ID)
BEGIN TRAN
IF @MoveFlag = 'up'
BEGIN
DECLARE @LitterID int
SET @LitterID =(         
SELECT ID FROM Category WHERE ParentID = @ParentID AND ShowOrder = @UpdateOrder -1)
UPDATE Category SET ShowOrder = @UpdateOrder -1 WHERE ID = @ID
UPDATE Category SET ShowOrder = @UpdateOrder WHERE ID = @LitterID
END
ELSE
IF @MoveFlag = 'down'
BEGIN
DECLARE @GreaterID int
SET @GreaterID =(
SELECT ID FROM Category
WHERE ParentID = @ParentID AND ShowOrder = @UpdateOrder + 1)
UPDATE Category SET ShowOrder = @UpdateOrder + 1 WHERE ID = @ID
UPDATE Category SET ShowOrder = @UpdateOrder WHERE ID = @GreaterID
END
COMMIT TRAN

使用存储过程操作数据的功能由Sample_08应用程序中的ProcedureOperate.aspx页面实现,它的代码隐藏文件为ProcedureOperate.aspx.aspx.cs。

1.创建ProcedureOperate.aspx页面

  在ProcedureOperate.aspx页面上创建一个GridView控件,ID属性的值为gvData。其中,gvData控件包含4个TemplateField,分别显示Category表中的记录的名称、显示顺序、父分类名称和用于排序的imgUp和imgDown按钮。ProcedureOperate.aspx页面的HTML设计代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProcedureOperate.aspx.cs"
Inherits="ProcedureOperate" %>
<head runat="server"><title>使用存储过程操作数据</title></head>
<asp:GridView ID="gvData" runat="server" AutoGenerateColumns="False"
onrowcommand="gvData_RowCommand">
<Columns>
<asp:TemplateField HeaderText="名称"><ItemTemplate>
<%# Eval("Name") %>
</ItemTemplate></asp:TemplateField>
<asp:TemplateField HeaderText="显示顺序"><ItemTemplate>
<%# Eval("ShowOrder") %>
</ItemTemplate></asp:TemplateField>
<asp:TemplateField HeaderText="父分类名称"><ItemTemplate>
<%# Eval("ParentName") %>
</ItemTemplate></asp:TemplateField>
<asp:TemplateField HeaderText="操作"><ItemTemplate>
<asp:ImageButton ID="imgUp" runat="server"
Visible='<%# (int)Eval("ShowOrder") > 1 ? true : false %>'
CommandArgument='<%# Eval("ID") %>'
CommandName="up" ImageUrl="Images/up.png" />&nbsp;
<asp:ImageButton ID="imgDown" runat="server"
Visible='<%# (int)Eval("SiblingCount") == (int)Eval("ShowOrder") ? false : true %>'
CommandArgument='<%# Eval("ID") %>'
CommandName="down" ImageUrl="Images/down.png" />
</ItemTemplate></asp:TemplateField>
</Columns>
</asp:GridView>

2.ProcedureOperate.aspx页面初始化

  ProcedureOperate.aspx页面初始化功能由其Page_Load(object sender, EventArgs e)事件实现。该事件调用ShowData()函数使用LINQ语句查询Category表中的记录,并显示在gvData控件中。其中,查询数据的LINQ查询表达式为“from r in db.Pr_GetCategorys() select r”。Page_Load(object sender, EventArgs e)事件和ShowData()函数的程序代码如下:

using System.Data.Linq;
using System.Collections.Generic;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack){ShowData();}
}
private void ShowData()
{   ///创建LinqDB数据库的数据上下文的实例
LinqDBDataContext db = new LinqDBDataContext(LinqSystem.LinqDBConnectionString);
///获取所有角色
var result = from r in db.Pr_GetCategorys()
select r;
///绑定控件数据,并显示数据
gvData.DataSource = result;
gvData.DataBind();
}

3.排序数据

  排序数据的功能由ProcedureOperate.aspx页面中的【 】(imgDown控件,实现下移功能)和【 】按钮(imgUp控件,实现上移功能)实现。当用户单击【 】或【 】按钮时,将触发gvData控件的RowCommand事件gvData_RowCommand(object sender,GridViewCommandEventArgs e)。该事件首先获取控件的CommandName和CommandArgument属性的值,并调用Pr_UpdateCategoryOrder(int iD,string moveFlag)方法实现上移或下移功能。gvData_RowCommand(object sender,GridViewCommandEventArgs e)事件的程序代码如下:

protected void gvData_RowCommand(object sender,GridViewCommandEventArgs e)
{   ///创建LinqDB数据库的数据上下文的实例
LinqDBDataContext db = new LinqDBDataContext(LinqSystem.LinqDBConnectionString);
switch (e.CommandName.ToLower())
{
case "up":
case "down":
{   ///修改分类的顺序,并重新显示数据
db.Pr_UpdateCategoryOrder(Int32.Parse(e.CommandArgument.ToString()),
e.CommandName.ToLower());
ShowData();
break;
}
default: break;
}
}

  把ProcedureOperate.aspx页面设置为Sample_08应用程序的起始页面,并运行Sample_08应用程序。ProcedureOperate.aspx页面的初始化界面如图所示,此时,该页面显示Category表中的记录。单击“122”分类所在行的【 】按钮3次,该记录将上移3个位置。此时,ProcedureOperate.aspx页面显示Category表中的记录,如图所示。

       

加支付宝好友偷能量挖...


评论(0)网络
阅读(112)喜欢(0)asp.net-linq