手机版

ASP.NET MVC用存储过程批量添加和修改数据

时间:2021-09-06 来源:互联网 编辑:宝哥软件园 浏览:

使用Entity Framework进行数据库交互,在代码中使用lamda表达式和linq直接操作数据库,节省了程序员访问数据库的代码时间,程序员可以直接专注于写业务逻辑层。然而,复杂的表关系关联很难查询或修改。通常的方法是使用EF执行SQL语句或“存储过程”,尤其是执行复杂的批处理任务。当然你也可以用MVC最底层的ADO.NET,这里就不多说了。如何做批量处理?这里我们讨论用EF下的存储过程批量添加修改后的数据。

需求如下:需要批量增加修改产品类别的发货任务金额,每月更新一次,月初返回0。添加后会显示在表单中,即所有的添加和修改都在一页上。

想法:前端首先用表单动态读出类别,然后用视图包动态加载到页面中。如果已经添加了当月任务数,则会读出并显示在表单上,可以修改;否则,它将被新添加。提交表单时出现问题。我想了一个办法,把类别号发布到后台,就是增加一个隐藏字段,值为Type |类别号’。在后台,通过判断是否包含Type来检索数据确定是否为类别号,然后通过split('|')[1]循环读取。

如何将其传输到数据库?我将数据保存到数据表中,然后用EF执行存储过程,并将数据表传输到参数前面的数据库中进行处理。

数据库如何处理这个数据表?处理自定义数据类型

代码步骤:

代码方面

控制器显示一个动态表单

public action result markettaskdadd(){ var markeType=new marketdata provider()。GetBTIDData()。其中(a=a.ID!='0');//读取类别varrel=newmarkettasksprovider()。getmarketmonthtask();if (rel。Count() 0) { ViewBag.datas=rel。Join(markeType,a=a.MKBTID,b=int。解析(b.ID),(a,b)=新的{ a.MKBTID,b.ID,b.Text,a.TaskNum })。select(s=new ViewsModel { ID=s . mkbtid . tostring(),Text=s.Text,TaskNum=s . TaskNum . tostring()});}//如果有关联数据,则为else {var rel2=markettype。选择(s=新视图模型{id=s.id,text=s.text,tasknum=''})。to list();//直接返回窗体ViewBag.datas=rel2}返回视图();}起初,我想直接返回到object,但是不支持前台遍历,所以我创建了一个新的实体类ViewsModel。

查看页面

@ foreach(var model markets in viewpag . datas){ div class=' row ' style=' margin-top :10 px ' div class=' col-MD-4 text-right ' span class=' red ' */span @ model markets。text/div class=' col-MD-8 text-left '输入名称='text| @modelMarkets。ID ' class=' form-control ' style=' width :50% ' value=' @ model markets。TaskNum ' type=' text '/input type=' hidden ' name=' type | @ model markets。ID' value='type|@modelMarkets。ID' /!-隐藏表单- /div /div}管理员提交表单

公共操作结果市场任务添加(字符串类型){ var strform=Request .形式;int userId=adminUser!=null?管理员用户.UserID:0//创建人或者修改人ID DataTable dt=new DataTable();dt .列。添加(' MKBTID ',类型获取类型(系统.int 32’;dt .列。添加('任务编号,类型获取类型(系统.int 32’;Liststring temp 1=new Liststring();Liststring temp 2=new Liststring();for(int I=0;我形成了。计数;i ) { if (strform[i]).包含(“type”){ temp 1 .添加(表格I ).split(' | ')[1]);} else { temp2 .add(strform[I]);}//循环分解表单} for(int I=0;我在试探。计数;i ) { DataRow dr=dt .NewRow();dr[0]=temp 1[I];dr[1]=temp 2[I];dt .行。添加(dr);//批量添加到datatable } var rel=new MarketTaskProgressProvider().markettasaddredit(userId,dt);//调用方法if(rel) ViewBag.js='scriptalert('操作成功!');窗户。位置。href='/MarketTaskProgress/MarketTaskAd ';/script ';else ViewBag.js='scriptalert('操作失败!');窗户。位置。href='/MarketTaskProgress/MarketTaskAd ';/script ';ListViewsModel listemp=new ListViewsModel();列表温度.添加(新视图模型{标识=' ',文本=' ',任务数=' ' });ViewBag.datas=listTemp返回视图();} }提交到数据库方法:

public bool markettasaddredit(int UserID,DataTable dt){ 0使用(dsessentity entity=new dsessentity())//不推荐用使用{ SQLParameter p=new SQLParameter(' @ create duser ',DbType .int 32);p。值=用户标识;SqlParameter P1=新的SqlParameter(' @ TableMarketTask ',DbType .对象);p1 .值=dtp1 .TypeName=' tableMarketTask//参数处理,貌似自定义函数必须加这个函数名称var rel=实体。数据库ExecuteSqlCommand('EXEC[dbo]).[PR _ markettasaddredit]@ create duser,@tableMarketTask ',p,P1);//ef执行存储过程返回rel 0;} }数据库方面

首先根据情况建自定义类型,如下

-创建数据类型创建类型[dbo].[tableMarketTask]AS TABLE([MKBTID][varchar](50)不为空,-投放类别[任务编号] [varchar](50)不为空-投放任务数量)也可以用sql server工具手动新建

第二是建存储过程

CREATE PROCEDURE PR _ marketasadredit @ CREATE duser INT,@ tableMarketTask tableMarketTask readonly-自定义类型的参数,必须加只读。AS DECLARE @ TempCreatedUser INT IF EXISTS(从市场中选择MarketMonthTask T其中月=月(GETDATE()))当月存在的话就修改BEGIN SELECT TOP 1 @ TempCreatedUser=CreatedUser FROM MarketMonthTask T WHERE月=月(GETDATE())DELETE FROM MarketMonthTask WHERE月=月(GETDATE())在MarketMonthTask中插入(MKBTID,TaskNum,UpdateUser,CreatedUser) SELECT MKBTID,TaskNum,Months(GETDATE()),@CreatedUser,@ TempCreatedUser FROM @ tableMarketTask END ELSE-或者直接插入BEGIN INSERT to market month task(MKBTID,TaskNum,Months,CreatedUser) SELECT MKBTID,TaskNum,Months(GETDATE()),@ CreatedUser FROM @ tableMarketTask END自定义类型可以像表那样自己查询,很方便。自定义函数不容易调试英孚。直接调用存储过程也不支持自定义函数。

以上所述是小编给大家介绍的ASP .NET MVC用存储过程批量添加修改数据操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

版权声明:ASP.NET MVC用存储过程批量添加和修改数据是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。