ASP.NET MVC はストアド プロシージャを使用してデータ操作をバッチで追加および変更します

高洛峰
リリース: 2017-02-20 17:11:45
オリジナル
2464 人が閲覧しました

この記事では、ストアド プロシージャを使用して ASP.NET MVC でデータを一括追加および変更する方法を主に紹介します。非常に優れており、必要な友人は参照できます。

データベースのやり取りには Entity Framework を使用し、lamda を直接使用します。コード内では、式と linq がデータベース上で動作するため、プログラマーはデータベース アクセスのコーディング時間を節約し、ビジネス ロジック層の作成に直接集中できます。ただし、より複雑なテーブルの関係をクエリしたり変更したりするのは、より手間がかかります。使用できる通常の方法は、EF を使用して SQL ステートメントまたは "ストアド プロシージャ" を実行することです。もちろん、MVC の下部で ADO.NET を使用することもできますが、ここでは説明しません。ここに。バッチの作り方は?ここでは、ストアド プロシージャを使用して、EF でデータをバッチで追加および変更する方法について説明します。

要件は次のとおりです。商品カテゴリの配送タスクの量は、月に 1 回更新され、月の初めに 0 にリセットされます。フォーム、つまり追加と変更はすべて 1 ページにあります。

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

アイデア: フロントエンドはまずフォームを使用してカテゴリーを動的に読み取り、当月のタスクの数が追加されている場合は、viewbag を使用してカテゴリーを動的にページにロードします。それ以外の場合は、当月のタスクの数が新たに追加されます。フォームを送信するときに、カテゴリ番号をバックエンドに送信する方法を考えました。つまり、バックエンドがデータを取得するかどうかを判断する方法を考えました。 Type はカテゴリ番号を含み、split('|')[1] を使用してループ内で読み取ります。

それをデータベースに渡すにはどうすればよいですか?データをデータテーブルに保存し、EF を使用してストアド プロシージャを実行し、データテーブルを処理用のパラメータとしてデータベースに渡します。

データベースはこのデータテーブルをどのように処理しますか?カスタム データ型での処理

コード ステップ:

コード アスペクト

コントローラーは動的フォームを表示します

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();
  }
ログイン後にコピー

最初はオブジェクトを直接返したかったのですが、フォアグラウンド トラバーサルはサポートしていなかったので、新しいエンティティ Class 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;
   }
  }
ログイン後にコピー

データベースアスペクト

まず独自のものを構築します。次のように入力します

-- Create the data type
CREATE TYPE [dbo].[tableMarketTask] AS TABLE(
 [MKBTID] [varchar](50) NOT NULL,--投放类别
 [TaskNum] [varchar](50) NOT NULL--投放任务数量
)
ログイン後にコピー

SQLサーバーツールを使用して新しいものを手動で作成することもできます

2番目はストアドプロシージャを作成することです

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 中国語 Web サイトをサポートしていただきありがとうございます。

ストアド プロシージャを使用してデータをバッチで追加および変更する ASP.NET MVC に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート