在開發過程中免不了創建實體類,字段少的表可以手動編寫,但是字段多還用手動創建的話不免有些浪費時間,假如一張表有100多個字段,手寫有些不現實。
這時我們會借助一些工具,如:動軟代碼生成器、各種ORM框架自帶的代碼生成器等等,都可以使用。
我們現在就基於SqlSugar(ORM框架)自己動手制造一個輪子,以SqlServer為例。我們先看一下成品效果,
使用流程:
配置好數據庫鏈接,點擊【鏈接數據庫】獲取指定服務器上的數據庫名,點擊數據庫名,動態獲取數據庫下面的所有表,
點擊數據表,如果生成過了的會自動獲取生成的實體,如果沒有生成過,點擊【生成實體】自動生成顯示,直接復制即可使用。
注:server=xxx.xxx.x.xxx這里如果是本地沒有配置的話直接server=.即可。
開發環境:
編譯器:Visual Studio 2017
運行環境:windows7 x64
數據庫:SqlServer2012
代碼實現步驟:
一、創建一個ASP.NET Web應用,命名為GenerateEntity
二、應用SqlSugar動態鏈接庫
三、編寫代碼
這里分為前端和后端,前端頁面展示,后端后台邏輯(注:由於我們是代碼展示,所以就不搞三層架構、工廠模式這些,直接在控制器中完成,有需要的同學可以根據項目需求進行更改)
內部實現邏輯:
- 在頁面上配置數據庫鏈接,點擊【鏈接數據庫】按鈕獲取指定數據庫的所有數據庫名顯示在左邊;
- 點擊左邊的數據庫名稱,動態獲取指定數據庫下面所有的表顯示出來;
- 點擊表名,生成過的就顯示生成的實體,沒有的則點擊【生成實體】按鈕生成(支持生成單表和數據庫表全部生成);
這里我直接貼出代碼,直接拷貝即可使用:
前端html頁面
1 @{ 2 ViewBag.Title = "Home Page"; 3 } 4 5 <script src="~/Scripts/jquery-3.3.1.js"></script> 6 7 <div style="margin-top:10px;font-family:'Microsoft YaHei';font-size:18px; "> 8 <div style="height:100px;width:100%;border:1px solid gray;padding:10px"> 9 <div> 10 <span>鏈接數據庫:</span> 11 <input style="width:800px;max-width:800px;" id="Link" value="server=xxx.xxx.x.xxx;uid=sa;pwd=xxx" /> 12 <a href="javascript:void(0)" onclick="LinkServer()">鏈接數據庫</a> 13 </div> 14 <div style="margin-top:10px"> 15 <span>數據庫名:</span> 16 <input style="color:red;font-weight:600" id="ServerName" /> 17 18 <span>表名:</span> 19 <input style="color:red;font-weight:600" id="TableName" /> 20 21 <span>生成類型:</span> 22 <select id="type"> 23 <option value="0">生成單個表</option> 24 <option value="1">生成所有表</option> 25 </select> 26 <a href="javascript:void(0)" onclick="GenerateEntity()" style="margin-left:20px;font-weight:600;">生成實體</a> 27 <br /> 28 29 </div> 30 </div> 31 <div style="height:720px;width:100%;"> 32 <div style="height:100%;width:40%;float:left; border:1px solid gray;font-size:20px"> 33 34 <div id="leftserver" style="float:left;border:1px solid gray;height:100%;width:40%;padding:10px;overflow: auto;"> 35 36 </div> 37 <div id="lefttable" style="float:left;border:1px solid gray;height:100%;width:60%;padding:10px;overflow: auto;"> 38 39 </div> 40 </div> 41 <div style="height:100%;width:60%;float:left;border:1px solid gray;overflow: auto;"> 42 <textarea style="width:100%;height:100%;max-width:10000px" id="righttable"></textarea> 43 </div> 44 </div> 45 </div> 46 47 <script type="text/javascript"> 48 49 //鏈接數據庫 50 function LinkServer() { 51 $.ajax({ 52 url: "/Home/LinkServer", 53 data: { Link: $("#Link").val() }, 54 type: "POST", 55 async: false, 56 dataType: "json", 57 success: function (data) { 58 if (data.res) { 59 if (data.info != "") { 60 $("#leftserver").html(""); 61 var leftserver = "<span>數據庫名</span><hr />"; 62 var info = eval("(" + data.info + ")"); 63 for (var i = 0; i < info.length; i++) { 64 leftserver += "<a onclick=\"leftserver('" + info[i].Name + "')\">" + info[i].Name + "</a><br />"; 65 } 66 67 $("#leftserver").html(leftserver); 68 } 69 } 70 else { 71 alert(data.msg); 72 } 73 } 74 }); 75 } 76 77 //查詢指定數據庫的表 78 function leftserver(Name) { 79 $("#ServerName").val(Name) 80 $.ajax({ 81 url: "/Home/GetTable", 82 data: { Link: $("#Link").val(), Name: Name }, 83 type: "POST", 84 async: false, 85 dataType: "json", 86 success: function (data) { 87 if (data.res) { 88 if (data.info != "") { 89 $("#lefttable").html(""); 90 var lefttable = "<span>表名</span><hr />"; 91 var info = eval("(" + data.info + ")"); 92 for (var i = 0; i < info.length; i++) { 93 lefttable += "<a onclick=\"lefttable('" + info[i].Name + "')\">" + info[i].Name + "</a><br />"; 94 } 95 96 $("#lefttable").html(lefttable); 97 } 98 } 99 else { 100 alert(data.msg); 101 } 102 } 103 }); 104 } 105 106 //查詢指定數據庫的表 107 function lefttable(Name) { 108 $("#TableName").val(Name); 109 $.ajax({ 110 url: "/Home/GetGenerateEntity", 111 data: { TableName: Name }, 112 type: "POST", 113 async: false, 114 dataType: "json", 115 success: function (data) { 116 if (data.res) { 117 document.getElementById("righttable").innerHTML = data.info; 118 } 119 else { 120 alert(data.msg); 121 } 122 } 123 }); 124 } 125 126 //生成實體 127 function GenerateEntity() { 128 129 $.ajax({ 130 url: "/Home/GenerateEntity", 131 data: { 132 Link: $("#Link").val(), 133 Name: $("#ServerName").val(), 134 TableName: $("#TableName").val(), 135 type: $("#type").val() 136 }, 137 type: "POST", 138 async: false, 139 dataType: "json", 140 success: function (data) { 141 if (data.res) { 142 document.getElementById("righttable").innerHTML = data.info; 143 } 144 else { 145 alert(data.msg); 146 } 147 } 148 }); 149 } 150 151 </script>
后端控制器數據
1 using SqlSugar; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Web; 7 using System.Web.Mvc; 8 9 namespace GenerateEntity.Controllers 10 { 11 public class HomeController : Controller 12 { 13 public ActionResult Index() 14 { 15 return View(); 16 } 17 18 public ActionResult About() 19 { 20 ViewBag.Message = "Your application description page."; 21 22 return View(); 23 } 24 25 public ActionResult Contact() 26 { 27 ViewBag.Message = "Your contact page."; 28 29 return View(); 30 } 31 32 33 34 //鏈接數據庫 35 public JsonResult LinkServer(string Link) 36 { 37 ResultInfo result = new ResultInfo(); 38 try 39 { 40 //配置數據庫連接 41 SqlSugarClient db = new SqlSugarClient( 42 new ConnectionConfig() 43 { 44 ConnectionString = ""+ Link + ";database=master", 45 DbType = DbType.SqlServer,//設置數據庫類型 46 IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放 47 InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息 48 }); 49 string sql = @"SELECT top 100000 Name FROM Master..SysDatabases ORDER BY Name"; //查詢所有鏈接的所有數據庫名 50 var strList = db.SqlQueryable<databaseName>(sql).ToList(); 51 result.info = Newtonsoft.Json.JsonConvert.SerializeObject(strList); 52 result.res = true; 53 result.msg = "鏈接成功!"; 54 } 55 catch (Exception ex) 56 { 57 result.msg = ex.Message; 58 } 59 60 return Json(result, JsonRequestBehavior.AllowGet); 61 } 62 63 //根據數據庫名查詢所有表 64 public JsonResult GetTable(string Link,string Name) 65 { 66 67 ResultInfo result = new ResultInfo(); 68 try 69 { 70 //配置數據庫連接 71 SqlSugarClient db = new SqlSugarClient( 72 new ConnectionConfig() 73 { 74 ConnectionString = "" + Link + ";database="+ Name + "", 75 DbType = DbType.SqlServer,//設置數據庫類型 76 IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放 77 InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息 78 }); 79 80 string sql = @"SELECT top 10000 Name FROM SYSOBJECTS WHERE TYPE='U' ORDER BY Name"; //查詢所有鏈接的所有數據庫名 81 var strList = db.SqlQueryable<databaseName>(sql).ToList(); 82 result.info = Newtonsoft.Json.JsonConvert.SerializeObject(strList); 83 result.res = true; 84 result.msg = "查詢成功!"; 85 } 86 catch (Exception ex) 87 { 88 result.msg = ex.Message; 89 } 90 91 return Json(result, JsonRequestBehavior.AllowGet); 92 } 93 94 //生成實體 95 public JsonResult GenerateEntity(string Link, string Name,string TableName,string type) 96 { 97 98 ResultInfo result = new ResultInfo(); 99 try 100 { 101 //配置數據庫連接 102 SqlSugarClient db = new SqlSugarClient( 103 new ConnectionConfig() 104 { 105 ConnectionString = "" + Link + ";database=" + Name + "", 106 DbType = DbType.SqlServer,//設置數據庫類型 107 IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放 108 InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息 109 }); 110 111 string path = "C:\\Demo\\2"; 112 113 if (type == "0") 114 { 115 path = "C:\\Demo\\2"; 116 db.DbFirst.Where(TableName).CreateClassFile(path); 117 result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8); 118 } 119 else if (type == "1") 120 { 121 path = "C:\\Demo\\3"; 122 db.DbFirst.IsCreateAttribute().CreateClassFile(path); 123 result.info = ""; 124 } 125 126 127 128 result.res = true; 129 result.msg = "生成成功!"; 130 } 131 catch (Exception ex) 132 { 133 result.msg = ex.Message; 134 } 135 136 return Json(result, JsonRequestBehavior.AllowGet); 137 } 138 139 //生成全部表時查看 140 public JsonResult GetGenerateEntity(string TableName) 141 { 142 143 ResultInfo result = new ResultInfo(); 144 try 145 { 146 string path = "C:\\Demo\\3"; 147 result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8); 148 result.res = true; 149 result.msg = "查詢成功!"; 150 } 151 catch (Exception ex) 152 { 153 result.msg = ex.Message; 154 try 155 { 156 if (result.msg.Contains("未能找到文件")) 157 { 158 string path = "C:\\Demo\\2"; 159 result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8); 160 result.res = true; 161 result.msg = "查詢成功!"; 162 } 163 } 164 catch (Exception) 165 { 166 result.msg = ex.Message; 167 } 168 } 169 170 return Json(result, JsonRequestBehavior.AllowGet); 171 } 172 173 //數據庫名 174 public class databaseName 175 { 176 public string Name { get; set; } 177 } 178 179 //封裝返回信息數據 180 public class ResultInfo 181 { 182 public ResultInfo() 183 { 184 res = false; 185 startcode = 449; 186 info = ""; 187 } 188 public bool res { get; set; } //返回狀態(true or false) 189 public string msg { get; set; } //返回信息 190 public int startcode { get; set; } //返回http的狀態碼 191 public string info { get; set; } //返回的結果(res為true時返回結果集,res為false時返回錯誤提示) 192 } 193 194 } 195 }