用Entity Framework 进行数据库交互,在代码里直接用lamda表达式和linq对数据库操作,中间为程序员省去了数据库访问的代码时间,程序员直接可以专注业务逻辑层的编写。但是对于比较复杂的表关系关联查询或者修改就比较费劲了。通常可以采用的方式是用EF执行SQL语句或者“存储过程”,特别是执行复杂批量任务,当然也可以在MVC底层用ADO.NET,这里就不多说了。怎么做批量呢?这里讲讲在EF下用存储过程批量添加修改数据。

需求是这样的:需要批量添加修改产品类别的投放任务数额,每月更新一次,月初归0,添加后会显示在表单中,也就是添加修改都在一个页面。
思路:前端先用表单把类别动态读取出来,用viewbag动态加载到页面,如果已经有添加当月任务数,就读取出来显示到表单上,可以进行修改,否则就是全新添加当月任务数。提交表单的时候出现了个问题,怎么把类别编号post到后台,我想了一个办法,那就是加一个隐藏域,值为"Type|类别编号",后台取数据是判断是否包含Type来判断是否是类别编号,然后用split('|')[1]循环读取。
怎么传递到数据库呢?我把数据存到datatable里面,然后用EF执行存储过程,把datatable当着参数传到数据库处理。
数据库怎么处理这个datatable呢?用自定义数据类型处理
代码步骤:
代码方面
控制器 显示动态表单
public ActionResult MarketTaskAdd()
{
var markeType = new MarketDataProvider().GetBTIDData().Where(a=>a.ID!="0");//读取类别
var rel = new MarketTaskProgressProvider().GetMarketMonthTask();
if (rel.Count() > 0)
{
ViewBag.datas = rel.Join(markeType, a => a.MKBTID, b => int.Parse(b.ID), (a, b) => new { 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 = markeType.Select(s => new ViewsModel{ ID = s.ID, Text = s.Text, TaskNum="" }).ToList();//直接返回表单
ViewBag.datas = rel2;
}
return View();
}
开始想直接返回object,结果前台遍历不支持,故新建实体类ViewsModel。
View页面
@foreach (var modelMarkets in ViewBag.datas)
{
<div class="row" style="margin-top:10px">
<div class="col-md-4 text-right"><span class="red">*</span> @modelMarkets.Text </div>
<div class="col-md-8 text-left">
<input name="text|@modelMarkets.ID" class="form-control" style="width:50%" value="@modelMarkets.TaskNum" type="text" />
<input type="hidden" name="type|@modelMarkets.ID" value="type|@modelMarkets.ID" /><!--隐藏表单-->
</div>
</div>
}
控制器 post提交表单
[HttpPost]
public ActionResult MarketTaskAdd(string type)
{
var strform = Request.Form;
int userId = adminUser!=null?adminUser.UserID:0;//创建人或者修改人ID
DataTable dt = new DataTable();
dt.Columns.Add("MKBTID",Type.GetType("System.Int32"));
dt.Columns.Add("TaskNum", Type.GetType("System.Int32"));
List<string> temp1 = new List<string>();
List<string> temp2 = new List<string>();
for (int i = 0; i < strform.Count; i++)
{
if (strform[i].Contains("type"))
{ temp1.Add(strform[i].Split('|')[1]); }
else
{ temp2.Add(strform[i]); }//循环分解表单
}
for (int i = 0; i < temp1.Count; i++)
{
DataRow dr = dt.NewRow();
dr[0] = temp1[i];
dr[1] = temp2[i];
dt.Rows.Add(dr);//批量添加到datatable
}
var rel = new MarketTaskProgressProvider().MarketTaskAddOrEdit(userId,dt);//调用方法
if(rel)
ViewBag.js = "<script>alert('操作成功!');window.location.href='/MarketTaskProgress/MarketTaskAdd';</script>";
else
ViewBag.js = "<script>alert('操作失败!');window.location.href='/MarketTaskProgress/MarketTaskAdd';</script>";
List<ViewsModel> listTemp = new List<ViewsModel>();
listTemp.Add(new ViewsModel
{
ID = "",
Text = "",
TaskNum = ""
});
ViewBag.datas = listTemp;
return View();
}
}
提交到数据库方法:
public bool MarketTaskAddOrEdit(int userId,DataTable dt)
{
using (DssEntity entity = new DssEntity())//不推荐用using
{
SqlParameter p = new SqlParameter("@CreatedUser",DbType.Int32);
p.Value = userId;
SqlParameter p1 = new SqlParameter("@tableMarketTask",DbType.Object);
p1.Value = dt;
p1.TypeName = "tableMarketTask";//参数处理,貌似自定义函数必须加这个函数名称
var rel = entity.Database.ExecuteSqlCommand("EXEC[dbo].[PR_MarketTaskAddorEdit] @CreatedUser,@tableMarketTask", p,p1);//ef执行存储过程
return rel > 0;
}
}
数据库方面
首先根据情况建自定义类型,如下
-- Create the data type CREATE TYPE [dbo].[tableMarketTask] AS TABLE( [MKBTID] [varchar](50) NOT NULL,--投放类别 [TaskNum] [varchar](50) NOT NULL--投放任务数量 )
也可以用sql server 工具手动新建
第二是建存储过程
CREATE PROCEDURE PR_MarketTaskAddorEdit @CreatedUser INT, @tableMarketTask tableMarketTask readonly --自定义类型的参数,必须加readonly。 AS DECLARE @TempCreatedUser INT IF EXISTS(SELECT TOP 1 * FROM MarketMonthTask T WHERE Months=MONTH(GETDATE()))--当月存在的话就修改 BEGIN SELECT TOP 1 @TempCreatedUser=CreatedUser FROM MarketMonthTask T WHERE Months=MONTH(GETDATE()) DELETE FROM MarketMonthTask WHERE Months=MONTH(GETDATE()) INSERT INTO MarketMonthTask(MKBTID,TaskNum,Months,UpdateUser,CreatedUser) SELECT MKBTID,TaskNum,MONTH(GETDATE()),@CreatedUser,@TempCreatedUser FROM @tableMarketTask END ELSE--或者直接插入 BEGIN INSERT INTO MarketMonthTask(MKBTID,TaskNum,Months,CreatedUser) SELECT MKBTID,TaskNum,MONTH(GETDATE()),@CreatedUser FROM @tableMarketTask END
自定义类型可以像表那样自己查询,很方便。自定义函数不容易调试。EF直接调用存储过程也不支持自定义函数。
以上所述是小编给大家介绍的ASP.NET MVC用存储过程批量添加修改数据操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# asp.net
# mvc
# 存储过程
# 批量添加修改
# .net core EF Core调用存储过程的方式
# C# Ado.net实现读取SQLServer数据库存储过程列表及参数信息示例
# .net core2.0下使用Identity改用dapper存储数据(实例讲解)
# asp.net中调用存储过程的方法
# asp.net中调用oracle存储过程的方法
# VB.NET调用MySQL存储过程并获得返回值的方法
# .Net下二进制形式的文件(图片)的存储与读取详细解析
# .NET中的字符串在内存中的存储方式
# 表单
# 自定义
# 当月
# 小编
# 判断是否
# 也不
# 都在
# 在此
# 是这样
# 说了
# 可以用
# 遍历
# 不多
# 我把
# 不容易
# 给大家
# 想了
# 不支持
# 怎么做
相关文章:
C++如何编写函数模板?(泛型编程入门)
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
视频网站制作教程,怎么样制作优酷网的小视频?
如何做网站制作流程,*游戏网站怎么搭建?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
,制作一个手机app网站要多少钱?
详解jQuery中基本的动画方法
韩国服务器如何优化跨境访问实现高效连接?
建站之星×万网:智能建站系统+自助建站平台一键生成
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
网站图片在线制作软件,怎么在图片上做链接?
Android使用GridView实现日历的简单功能
建站VPS能否同时实现高效与安全翻墙?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
如何通过VPS搭建网站快速盈利?
如何高效利用200m空间完成建站?
如何有效防御Web建站篡改攻击?
如何在宝塔面板中创建新站点?
手机网站制作与建设方案,手机网站如何建设?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
历史网站制作软件,华为如何找回被删除的网站?
如何用PHP快速搭建高效网站?分步指南
建站VPS选购需注意哪些关键参数?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
制作门户网站的参考文献在哪,小说网站怎么建立?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
如何在景安云服务器上绑定域名并配置虚拟主机?
电商网站制作价格怎么算,网上拍卖流程以及规则?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
建站10G流量真的够用吗?如何应对访问高峰?
建站主机是否属于云主机类型?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
如何快速重置建站主机并恢复默认配置?
宝塔建站无法访问?如何排查配置与端口问题?
济南网站制作的价格,历城一职专官方网站?
宝塔新建站点为何无法访问?如何排查?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
大型企业网站制作流程,做网站需要注册公司吗?
宝塔面板创建网站无法访问?如何快速排查修复?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
英语简历制作免费网站推荐,如何将简历翻译成英文?
魔方云NAT建站如何实现端口转发?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
如何在阿里云高效完成企业建站全流程?
如何设计高效校园网站?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
建站之星如何优化SEO以实现高效排名?
*请认真填写需求信息,我们会在24小时内与您取得联系。