>  기사  >  백엔드 개발  >  ASP.NET MVC는 저장 프로시저를 사용하여 데이터 작업을 일괄적으로 추가하고 수정합니다.

ASP.NET MVC는 저장 프로시저를 사용하여 데이터 작업을 일괄적으로 추가하고 수정합니다.

高洛峰
高洛峰원래의
2017-02-20 17:11:452474검색

이 기사에서는 저장 프로시저를 사용하여 ASP.NET MVC에서 데이터를 일괄 추가하고 수정하는 방법을 주로 소개합니다. 매우 훌륭하고 참고할 가치가 있습니다. 필요한 친구는

데이터베이스에 Entity Framework 사용하기를 참조하세요. 상호 작용 람다 식과 linq를 직접 사용하여 코드에서 데이터베이스를 작동하므로 프로그래머는 데이터베이스 액세스를 위한 코딩 시간을 절약할 수 있습니다. 그러나 더 복잡한 테이블 관계를 쿼리하거나 수정하는 것은 더 힘듭니다. 사용할 수 있는 일반적인 방법은 EF를 사용하여 SQL 문이나 "저장 프로시저"를 실행하는 것입니다. 특히 복잡한 일괄 작업을 실행하는 경우에는 MVC의 맨 아래에서 ADO.NET을 사용할 수도 있습니다. 이에 대해서는 다루지 않겠습니다. 여기로. 배치를 만드는 방법은 무엇입니까? 여기서는 저장 프로시저를 사용하여 EF에서 일괄적으로 데이터를 추가하고 수정하는 방법에 대해 설명합니다.

요구사항은 다음과 같습니다. 상품 카테고리별 배송 업무량을 일괄 추가 및 수정해야 하며, 월 1회 업데이트되며, 추가 후 월초에 0으로 재설정됩니다. 즉, 추가와 수정이 모두 한 페이지에 표시됩니다.

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

아이디어: 프런트 엔드는 먼저 양식을 사용하여 카테고리를 동적으로 읽고, viewbag을 사용하여 동적으로 로드합니다. 이미 해당 월의 작업 수가 추가된 후 양식에 표시되고 수정이 가능합니다. 양식을 제출할 때 문제가 발생했습니다. 백엔드에 카테고리 번호를 게시하는 방법은 무엇입니까? 즉, "Type|Category Number" 값을 가진 숨겨진 필드를 추가하는 것입니다. 여기에는 Type이 포함되어 있으며, 분할('|')[1]을 사용하여 루프에서 읽습니다.

데이터베이스에 어떻게 전달하나요? 데이터를 데이터 테이블에 저장한 다음 EF를 사용하여 저장 프로시저를 실행하고 데이터 테이블을 처리를 위한 매개 변수로 데이터베이스에 전달합니다.

데이터베이스는 이 데이터 테이블을 어떻게 처리하나요? 사용자 정의 데이터 유형을 사용하여 처리

코드 단계:

코드 측면

컨트롤러 디스플레이 동적 form

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();
  }

처음에는 객체를 직접 반환하고 싶었지만 포그라운드 순회가 지원되지 않아서 새로운 엔터티 클래스 ViewsModel을 만들었습니다.

페이지 보기

@foreach (var modelMarkets in ViewBag.datas)
       {
        <p class="row" style="margin-top:10px">
         <p class="col-md-4 text-right"><span class="red">*</span> @modelMarkets.Text </p>
         <p 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" /><!--隐藏表单-->
         </p>
        </p>
       }

컨트롤러 게시물 제출 양식

[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(&#39;|&#39;)[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(&#39;操作成功!&#39;);window.location.href=&#39;/MarketTaskProgress/MarketTaskAdd&#39;;</script>";
   else
    ViewBag.js = "<script>alert(&#39;操作失败!&#39;);window.location.href=&#39;/MarketTaskProgress/MarketTaskAdd&#39;;</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;
   }
  }

데이터베이스 측면

먼저 상황에 따라 다음과 같이 Custom Type을 생성합니다

-- 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의 데이터를 일괄 추가하고 수정하는 작업입니다. 궁금한 사항이 있으면 메시지를 남겨주세요. 편집자는 모든 사람에게 즉시 답변을 드릴 것입니다. 또한 PHP 중국어 웹사이트를 지원해 주신 모든 분들께 감사드립니다!

저장 프로시저를 사용하여 일괄적으로 데이터를 추가하고 수정하는 ASP.NET MVC와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.