全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

用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中的字符串在内存中的存储方式  # 表单  # 自定义  # 当月  # 小编  # 判断是否  # 也不  # 都在  # 在此  # 是这样  # 说了  # 可以用  # 遍历  # 不多  # 我把  # 不容易  # 给大家  # 想了  # 不支持  # 怎么做 


相关文章: 家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  高端网站建设与定制开发一站式解决方案 中企动力  网站制作的步骤包括,正确网址格式怎么写?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  如何撰写建站申请书?关键要点有哪些?  建站之星安装后如何自定义网站颜色与字体?  网站制作员失业,怎样查看自己网站的注册者?  如何用狗爹虚拟主机快速搭建网站?  如何在云主机上快速搭建多站点网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何做静态网页,sublimetext3.0制作静态网页?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  如何在服务器上配置二级域名建站?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何快速搭建高效WAP手机网站?  如何快速搭建响应式可视化网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  建站主机空间推荐 高性价比配置与快速部署方案解析  如何选购建站域名与空间?自助平台全解析  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  Swift中循环语句中的转移语句 break 和 continue  如何高效配置香港服务器实现快速建站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  专业商城网站制作公司有哪些,pi商城官网是哪个?  建站之星后台管理如何实现高效配置?  建站之星如何保障用户数据免受黑客入侵?  学校建站服务器如何选型才能满足性能需求?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何在香港免费服务器上快速搭建网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  小型网站建站如何选择虚拟主机?  兔展官网 在线制作,怎样制作微信请帖?  如何快速搭建高效香港服务器网站?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何通过IIS搭建网站并配置访问权限?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  已有域名能否直接搭建网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  香港服务器网站推广:SEO优化与外贸独立站搭建策略  建站主机默认首页配置指南:核心功能与访问路径优化  制作国外网站的软件,国外有哪些比较优质的网站推荐?  长沙做网站要多少钱,长沙国安网络怎么样?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  如何在西部数码注册域名并快速搭建网站?  IOS倒计时设置UIButton标题title的抖动问题  建站VPS选购需注意哪些关键参数?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。