直接上干活,至於網上的一大堆處理方式不予評論,做好自己的就是最好的,供大家不走彎路
1、view頁面
<link href="~/Content/bootstrap.css" rel="stylesheet" /> <div class="well"> <table class="table"> <tr> <th>用戶名</th> <th>地址</th> <th>訂單編號</th> <th>城市代號</th> <th>時間</th> <th>訂單狀態</th> </tr> @foreach (var item in ViewBag.dyObject) { <tr> <td>@item.UserName </td> <td>@item.LocalAddress </td> <td>@item.BargainOrderCode </td> <td>@item.CityCode </td> <td>@item.UpdateTime </td> <td>@item.OrderStatus </td> </tr> } </table> </div>
2、Controller 控制器代碼
public async Task<ActionResult> UserOrder() { #region 使用存儲過程實現多表聯查VIEW顯示 int lastID = 0; int pageSize = 10; SqlParameter[] Param = { new SqlParameter("@lastID", System.Data.SqlDbType.Int), new SqlParameter("@pageSize", System.Data.SqlDbType.Int) }; if (lastID< 0) { Param[0].Value = DBNull.Value; } else { Param[0].Value = lastID; } if (pageSize< 0) { Param[1].Value = DBNull.Value; } else { Param[1].Value = pageSize; } var data = await _DbContext.Exec_SpAsync("SP_GetUserOrderList", Param); //foreach (Dictionary<string, object> item in data) //{ // string UserName = item["UserName"].ToString(); // string LocalAddress = item["LocalAddress"].ToString(); // string BargainOrderCode = item["BargainOrderCode"].ToString(); // string CityCode = item["CityCode"].ToString(); // DateTime UpdateTime = Convert.ToDateTime(item["UpdateTime"]); // int OrderStatus = Convert.ToInt32(item["OrderStatus"]); //} List<dynamic> userList = new List<dynamic>(); foreach (Dictionary<string, object> item in data) { //userList.Add(new //{ // UserName = item["UserName"].ToString(), // LocalAddress = item["LocalAddress"].ToString(), // BargainOrderCode = item["BargainOrderCode"].ToString(), // CityCode = item["CityCode"].ToString(), // UpdateTime =Convert.ToDateTime(item["UpdateTime"]), // OrderStatus =Convert.ToInt32(item["OrderStatus"]) // }); dynamic dyObject = new ExpandoObject(); dyObject.UserName = item["UserName"].ToString(); dyObject.LocalAddress = item["LocalAddress"].ToString(); dyObject.BargainOrderCode = item["BargainOrderCode"].ToString(); dyObject.CityCode = item["CityCode"].ToString(); dyObject.UpdateTime = Convert.ToDateTime(item["UpdateTime"]); dyObject.OrderStatus = Convert.ToInt32(item["OrderStatus"]); userList.Add(dyObject); } ViewBag.dyObject = userList; return View(); #endregion }
3、EF中多表查詢操作的存儲過程通用調用方法
/// <summary> /// 存儲共用 /// </summary> public static class StorageCommon { /// <summary> /// 帶有參數的存儲過程公共方法 獲取信息集合 以及返回空值處理 /// </summary> /// <param name="db"></param> /// <param name="sql"></param> /// <param name="sqlParams"></param> /// <returns></returns> public async static Task<ArrayList> Exec_SpAsync(this DefaultDbContext db, string sql, SqlParameter[] sqlParams) { using (var cmd = db.Database.Connection.CreateCommand()) { await db.Database.Connection.OpenAsync(); cmd.CommandText = sql; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddRange(sqlParams); var dr = await cmd.ExecuteReaderAsync(); var columnSchema = dr.GetColumnSchema(); var data = new ArrayList(); while (await dr.ReadAsync()) { var item = new Dictionary<string, object>(); foreach (var kv in columnSchema) { if (kv.ColumnOrdinal.HasValue) { var itemVal = dr.GetValue(kv.ColumnOrdinal.Value); item.Add(kv.ColumnName, itemVal.GetType() != typeof(DBNull) ? itemVal : ""); } } data.Add(item); } dr.Dispose(); return data; } } 完善后代碼:
public async static Task<ArrayList> Exec_SpAsync(this DefaultDbContext db, string sql, SqlParameter[] sqlParams) { var data = new ArrayList(); DbDataReader dr=null ; try { using (var cmd = db.Database.Connection.CreateCommand()) { await db.Database.Connection.OpenAsync(); cmd.CommandText = sql; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddRange(sqlParams); //var dr = await cmd.ExecuteReaderAsync(); dr = await cmd.ExecuteReaderAsync(); var columnSchema = dr.GetColumnSchema(); while (await dr.ReadAsync()) { var item = new Dictionary<string, object>(); foreach (var kv in columnSchema) { if (kv.ColumnOrdinal.HasValue) { var itemVal = dr.GetValue(kv.ColumnOrdinal.Value); item.Add(kv.ColumnName, itemVal.GetType() != typeof(DBNull) ? itemVal : ""); } } data.Add(item); } } } catch (Exception ex) { _Logger.Error("查詢數據" + ex.Message); //throw new Exception("查詢失敗." + ex.Message); } finally { dr.Dispose(); } return data; }
/// <summary> /// 異步執行帶有參數的存儲過程公共方法 增刪改操作以及返回帶有輸出的參數 /// </summary> /// <param name="db"></param> /// <param name="sql"></param> /// <param name="sqlParams"></param> /// <returns></returns> public async static Task<int> ExecuteNonQueryAsync(this DefaultDbContext db, string sql, SqlParameter[] sqlParams) { int numint; using (var cmd = db.Database.Connection.CreateCommand()) { await db.Database.Connection.OpenAsync(); cmd.CommandText = sql; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddRange(sqlParams); numint = await cmd.ExecuteNonQueryAsync(); cmd.Connection.Close(); } return numint; }
完善后代碼: public async static Task<int> ExecuteNonQueryAsync999(this DefaultDbContext db, string sql, SqlParameter[] sqlParams) { int numint=0; using (var cmd = db.Database.Connection.CreateCommand()) { try { await db.Database.Connection.OpenAsync(); cmd.CommandText = sql; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddRange(sqlParams); numint = await cmd.ExecuteNonQueryAsync(); cmd.Connection.Close(); } catch (Exception ex) { _Logger.Error("執行數據" + ex.Message); //throw new Exception("提交失敗." + ex.Message); } finally { cmd.Connection.Dispose(); } return numint; } }
public class RetCode { public const int SUCCESS = 0; public const int ERROR = -1; } public class AsResult { private const int STATUS_CODE = 100; private const string CONTENT_TYPE = "application/json;charset=utf-8"; private readonly static Dictionary<int, string> message = new Dictionary<int, string>() { { RetCode.SUCCESS, "success" }, { RetCode.ERROR, "" }, }; public static ContentResult Success(Object data = null) { var content = new { RetCode = RetCode.SUCCESS, Message = message[RetCode.SUCCESS], Data = data ?? new { } }; return new ContentResult { //StatusCode = STATUS_CODE, ContentType = CONTENT_TYPE, Content = JsonConvert.SerializeObject(content).ToString() }; } public static ContentResult Error(int code, string moreMsg = "") { string msg = ""; if (message.ContainsKey(code)) { msg = message[code]; } msg = String.IsNullOrEmpty(msg) ? moreMsg : msg + ", " + moreMsg; var content = new { RetCode = code, Message = msg, Data = new { } }; return new ContentResult { //StatusCode = STATUS_CODE, ContentType = CONTENT_TYPE, Content = JsonConvert.SerializeObject(content).ToString() }; } } }
4、存儲過程
CREATE PROCEDURE [dbo].[SP_GetUserOrderList] ( @lastID int=0, --當前頁數 @pageSize int=10 --每頁顯示記錄數 ) AS --declare @rt_code int; --聲明變量 BEGIN begin transaction begin try BEGIN SELECT DISTINCT top (@pageSize) -- CONVERT(varchar(100), order.UpdateTime, 20) AS UpdateTime * FROM UserInfo_test usertest LEFT JOIN TRA_BargainOrder_Test ordertest ON usertest.Id=ordertest.UserID where (( @lastID > 0 AND usertest.Id < @lastID) OR @lastID=0 ) -- and CONVERT(varchar(100), MB.AddTime, 23)>CONVERT(varchar(100), @StartTime, 23) --AND CONVERT(varchar(100), MB.AddTime, 23)<CONVERT(varchar(100), @EndTime, 23) ORDER BY ordertest.UpdateTime DESC; END commit transaction end try ---------------------------------------------------------------------------------------------------------------------------- begin catch print '執行存儲異常' rollback transaction end catch END GO