この記事では、ストアド プロシージャを使用して ASP.NET MVC でデータを一括追加および変更する方法を主に紹介します。非常に優れており、必要な友人は参照できます。
データベースのやり取りには Entity Framework を使用し、lamda を直接使用します。コード内では、式と linq がデータベース上で動作するため、プログラマーはデータベース アクセスのコーディング時間を節約し、ビジネス ロジック層の作成に直接集中できます。ただし、より複雑なテーブルの関係をクエリしたり変更したりするのは、より手間がかかります。使用できる通常の方法は、EF を使用して SQL ステートメントまたは "ストアド プロシージャ" を実行することです。もちろん、MVC の下部で ADO.NET を使用することもできますが、ここでは説明しません。ここに。バッチの作り方は?ここでは、ストアド プロシージャを使用して、EF でデータをバッチで追加および変更する方法について説明します。
要件は次のとおりです。商品カテゴリの配送タスクの量は、月に 1 回更新され、月の初めに 0 にリセットされます。フォーム、つまり追加と変更はすべて 1 ページにあります。
アイデア: フロントエンドはまずフォームを使用してカテゴリーを動的に読み取り、当月のタスクの数が追加されている場合は、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('|')[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サーバーツールを使用して新しいものを手動で作成することもできます
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 サイトに注目してください。