精通LINQ--8.2.6 使用存储过程操作数据

  8.2.48.2.5小节中已经分别介绍了使用存储过程查询单表和多表数据的方法。本小节介绍使用存储过程查询操作数据的方法。

下面的代码实例在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控件包含4TemplateField,分别显示Category表中的记录的名称、显示顺序、父分类名称和用于排序的imgUpimgDown按钮。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>

2ProcedureOperate.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)。该事件首先获取控件的CommandNameCommandArgument属性的值,并调用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表中的记录,如图所示。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值