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" /> <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表中的记录,如图所示。
加支付宝好友偷能量挖...