轉載大哥自 https://www.cnblogs.com/xiongze520/archive/2020/06/23/13181241.html
在開發過程中免不了創建實體類,字段少的表可以手動編寫,但是字段多還用手動創建的話不免有些浪費時間,假如一張表有100多個字段,手寫有些不現實。
這時我們會借助一些工具,如:動軟代碼生成器、各種ORM框架自帶的代碼生成器等等,都可以使用。
我們現在就基於SqlSugar(ORM框架)自己動手制造一個輪子,以SqlServer為例。我們先看一下成品效果,
使用流程:
配置好數據庫鏈接,點擊【鏈接數據庫】獲取指定服務器上的數據庫名,點擊數據庫名,動態獲取數據庫下面的所有表,
點擊數據表,如果生成過了的會自動獲取生成的實體,如果沒有生成過,點擊【生成實體】自動生成顯示,直接復制即可使用。
注:server=192.168.0.154這里如果是本地沒有配置的話直接server=.即可。

開發環境:
編譯器:Visual Studio 2017
運行環境:windows7 x64
數據庫:SqlServer2012
代碼實現步驟:
一、創建一個ASP.NET Web應用,命名為GenerateEntity


二、應用SqlSugar動態鏈接庫

三、編寫代碼
這里分為前端和后端,前端頁面展示,后端后台邏輯(注:由於我們是代碼展示,所以就不搞三層架構、工廠模式這些,直接在控制器中完成,有需要的同學可以根據項目需求進行更改)
內部實現邏輯:
- 在頁面上配置數據庫鏈接,點擊【鏈接數據庫】按鈕獲取指定數據庫的所有數據庫名顯示在左邊;
- 點擊左邊的數據庫名稱,動態獲取指定數據庫下面所有的表顯示出來;
- 點擊表名,生成過的就顯示生成的實體,沒有的則點擊【生成實體】按鈕生成(支持生成單表和數據庫表全部生成);
這里我直接貼出代碼,直接拷貝即可使用:
前端html頁面
@{
ViewBag.Title = "Home Page";
}
<script src="~/Scripts/jquery-3.3.1.js"></script>
<div style="margin-top:10px;font-family:'Microsoft YaHei';font-size:18px; ">
<div style="height:100px;width:100%;border:1px solid gray;padding:10px">
<div>
<span>鏈接數據庫:</span>
<input style="width:800px;max-width:800px;" id="Link" value="server=192.168.0.154;uid=sa;pwd=jutong!%(!%(" />
<a href="javascript:void(0)" onclick="LinkServer()">鏈接數據庫</a>
</div>
<div style="margin-top:10px">
<span>數據庫名:</span>
<input style="color:red;font-weight:600" id="ServerName" />
<span>表名:</span>
<input style="color:red;font-weight:600" id="TableName" />
<span>生成類型:</span>
<select id="type">
<option value="0">生成單個表</option>
<option value="1">生成所有表</option>
</select>
<a href="javascript:void(0)" onclick="GenerateEntity()" style="margin-left:20px;font-weight:600;">生成實體</a>
<br />
</div>
</div>
<div style="height:720px;width:100%;">
<div style="height:100%;width:40%;float:left; border:1px solid gray;font-size:20px">
<div id="leftserver" style="float:left;border:1px solid gray;height:100%;width:40%;padding:10px;overflow: auto;">
</div>
<div id="lefttable" style="float:left;border:1px solid gray;height:100%;width:60%;padding:10px;overflow: auto;">
</div>
</div>
<div style="height:100%;width:60%;float:left;border:1px solid gray;overflow: auto;">
<textarea style="width:100%;height:100%;max-width:10000px" id="righttable"></textarea>
</div>
</div>
</div>
<script type="text/javascript">
//鏈接數據庫
function LinkServer() {
$.ajax({
url: "/Home/LinkServer",
data: { Link: $("#Link").val() },
type: "POST",
async: false,
dataType: "json",
success: function (data) {
if (data.res) {
if (data.info != "") {
$("#leftserver").html("");
var leftserver = "<span>數據庫名</span><hr />";
var info = eval("(" + data.info + ")");
for (var i = 0; i < info.length; i++) {
leftserver += "<a onclick=\"leftserver('" + info[i].Name + "')\">" + info[i].Name + "</a><br />";
}
$("#leftserver").html(leftserver);
}
}
else {
alert(data.msg);
}
}
});
}
//查詢指定數據庫的表
function leftserver(Name) {
$("#ServerName").val(Name)
$.ajax({
url: "/Home/GetTable",
data: { Link: $("#Link").val(), Name: Name },
type: "POST",
async: false,
dataType: "json",
success: function (data) {
if (data.res) {
if (data.info != "") {
$("#lefttable").html("");
var lefttable = "<span>表名</span><hr />";
var info = eval("(" + data.info + ")");
for (var i = 0; i < info.length; i++) {
lefttable += "<a onclick=\"lefttable('" + info[i].Name + "')\">" + info[i].Name + "</a><br />";
}
$("#lefttable").html(lefttable);
}
}
else {
alert(data.msg);
}
}
});
}
//查詢指定數據庫的表
function lefttable(Name) {
$("#TableName").val(Name);
$.ajax({
url: "/Home/GetGenerateEntity",
data: { TableName: Name },
type: "POST",
async: false,
dataType: "json",
success: function (data) {
if (data.res) {
document.getElementById("righttable").innerHTML = data.info;
}
else {
alert(data.msg);
}
}
});
}
//生成實體
function GenerateEntity() {
$.ajax({
url: "/Home/GenerateEntity",
data: {
Link: $("#Link").val(),
Name: $("#ServerName").val(),
TableName: $("#TableName").val(),
type: $("#type").val()
},
type: "POST",
async: false,
dataType: "json",
success: function (data) {
if (data.res) {
document.getElementById("righttable").innerHTML = data.info;
}
else {
alert(data.msg);
}
}
});
}
</script>
后端控制器數據
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
namespace GenerateEntity.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
//鏈接數據庫
public JsonResult LinkServer(string Link)
{
ResultInfo result = new ResultInfo();
try
{
//配置數據庫連接
SqlSugarClient db = new SqlSugarClient(
new ConnectionConfig()
{
ConnectionString = ""+ Link + ";database=master",
DbType = DbType.SqlServer,//設置數據庫類型
IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放
InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息
});
string sql = @"SELECT top 100000 Name FROM Master..SysDatabases ORDER BY Name"; //查詢所有鏈接的所有數據庫名
var strList = db.SqlQueryable<databaseName>(sql).ToList();
result.info = Newtonsoft.Json.JsonConvert.SerializeObject(strList);
result.res = true;
result.msg = "鏈接成功!";
}
catch (Exception ex)
{
result.msg = ex.Message;
}
return Json(result, JsonRequestBehavior.AllowGet);
}
//根據數據庫名查詢所有表
public JsonResult GetTable(string Link,string Name)
{
ResultInfo result = new ResultInfo();
try
{
//配置數據庫連接
SqlSugarClient db = new SqlSugarClient(
new ConnectionConfig()
{
ConnectionString = "" + Link + ";database="+ Name + "",
DbType = DbType.SqlServer,//設置數據庫類型
IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放
InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息
});
string sql = @"SELECT top 10000 Name FROM SYSOBJECTS WHERE TYPE='U' ORDER BY Name"; //查詢所有鏈接的所有數據庫名
var strList = db.SqlQueryable<databaseName>(sql).ToList();
result.info = Newtonsoft.Json.JsonConvert.SerializeObject(strList);
result.res = true;
result.msg = "查詢成功!";
}
catch (Exception ex)
{
result.msg = ex.Message;
}
return Json(result, JsonRequestBehavior.AllowGet);
}
//生成實體
public JsonResult GenerateEntity(string Link, string Name,string TableName,string type)
{
ResultInfo result = new ResultInfo();
try
{
//配置數據庫連接
SqlSugarClient db = new SqlSugarClient(
new ConnectionConfig()
{
ConnectionString = "" + Link + ";database=" + Name + "",
DbType = DbType.SqlServer,//設置數據庫類型
IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放
InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息
});
string path = "C:\\Demo\\2";
if (type == "0")
{
path = "C:\\Demo\\2";
db.DbFirst.Where(TableName).CreateClassFile(path);
result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8);
}
else if (type == "1")
{
path = "C:\\Demo\\3";
db.DbFirst.IsCreateAttribute().CreateClassFile(path);
result.info = "";
}
result.res = true;
result.msg = "生成成功!";
}
catch (Exception ex)
{
result.msg = ex.Message;
}
return Json(result, JsonRequestBehavior.AllowGet);
}
//生成全部表時查看
public JsonResult GetGenerateEntity(string TableName)
{
ResultInfo result = new ResultInfo();
try
{
string path = "C:\\Demo\\3";
result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8);
result.res = true;
result.msg = "查詢成功!";
}
catch (Exception ex)
{
result.msg = ex.Message;
try
{
if (result.msg.Contains("未能找到文件"))
{
string path = "C:\\Demo\\2";
result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8);
result.res = true;
result.msg = "查詢成功!";
}
}
catch (Exception)
{
result.msg = ex.Message;
}
}
return Json(result, JsonRequestBehavior.AllowGet);
}
//數據庫名
public class databaseName
{
public string Name { get; set; }
}
//封裝返回信息數據
public class ResultInfo
{
public ResultInfo()
{
res = false;
startcode = 449;
info = "";
}
public bool res { get; set; } //返回狀態(true or false)
public string msg { get; set; } //返回信息
public int startcode { get; set; } //返回http的狀態碼
public string info { get; set; } //返回的結果(res為true時返回結果集,res為false時返回錯誤提示)
}
}
}
這樣一套可視化代碼生成器就出來了,我們把他發布到IIS上面,然后設置為瀏覽器標簽(收藏),這樣就可以快捷使用了。
我們運行一下看看,是不是感覺很方便呀!


