在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有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="">生成单个表</option>
<option value="">生成所有表</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 = ; 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 = ; 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 == "")
{
path = "C:\\Demo\\2";
db.DbFirst.Where(TableName).CreateClassFile(path);
result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8);
}
else if (type == "")
{
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 = ;
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上面,然后设置为浏览器标签(收藏),这样就可以快捷使用了。

我们运行一下看看,是不是感觉很方便呀!

欢迎关注订阅我的微信公众平台【熊泽有话说】,更多好玩易学知识等你来取
作者:熊泽-学习中的苦与乐
公众号:熊泽有话说

出处:https://www.cnblogs.com/xiongze520/p/13181241.html


创作不易,版权归作者和博客园共有,转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。

手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)的更多相关文章

  1. 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)

    今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...

  2. 手把手教你基于Netty实现一个基础的RPC框架(通俗易懂)

    阅读这篇文章之前,建议先阅读和这篇文章关联的内容. [1]详细剖析分布式微服务架构下网络通信的底层实现原理(图解) [2][年薪60W的技巧]工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...

  3. 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别(含源码)

    前言 上一篇博客给大家介绍了LabVIEW开放神经网络交互工具包[ONNX],今天我们就一起来看一下如何使用LabVIEW开放神经网络交互工具包实现TensorRT加速YOLOv5. 以下是YOLOv ...

  4. 可视化查询(sp_helptext)——快速查询包含指定字符串的存储过程(附源码)

    前言 在开发中,随着业务逻辑的调整,修改存储过程是必不可免的. 那怎么定位到需要修改的存储过程呢?一个一个的点开查询?存储过程少的话还行,一旦存储过程过多,这样是很浪费时间的,一个不注意还会遗漏掉. ...

  5. Delphi - 手把手教你基于D7+Access常用管理系统架构的设计与实现 (更新中)

    前言 从事软件开发工作好多年了,学的越深入越觉得自己无知,所以还是要对知识保持敬畏之心,活到老,学到老! 健身和代码一样都不能少,身体是革命的本钱,特别是我们这种高危工种,所以小伙伴们运动起来!有没有 ...

  6. 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统系列博文索引

    近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开 ...

  7. 手把手教你用vue-cli构建一个简单的路由应用

    上一章说道:十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635 开发环境搭建好之后,那么开始新添加一些页面,构建最基本的vue项目, ...

  8. 手把手教你用redis实现一个简单的mq消息队列(java)

    众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...

  9. 手把手教你使用 js 实现一个 Canvas 编辑器

    手把手教你使用 js 实现一个 Canvas 编辑器 拖拽 缩放,等比缩放 导出 image 模版 撤销,重做 OOP,封装,继承,多态 发布库 CI/CD (gitlab/github) ... h ...

随机推荐

  1. 华容道题解 NOIP2013 思路题!

    第一次发紫题题解,居然在发布前太激动,把刚写好的还没发布的题解一个Ctrl+A和Backspace全删了.(所以这是二稿) luogu题目传送门 前置: 做本题一定要有的一些思想: 1.从简思想: 模 ...

  2. [Office#PPT]0001.实例剖析-如何制作一个牛B的融资PPT

    一些好公司明明在模式上富有创新性,但却在 pitch 时很保守,而且他们又不缺设计和开发能力.如何设计你的融资演讲稿才会吸引投资人对你投资?投资人 Daniel Eckler给大家贡献了下面这篇技术贴 ...

  3. [Python番外]001.用Sublime开发Python

    用Sublime开发Python 准备 安装Package Control插件 安装Python插件 Python环境配置 修改快捷键 准备 安装Python 详见 Python准备 下载Sublim ...

  4. 小工具之apk黑屏自动检测

    在打包测试的时候经常发送给测试组之后,发现已进入游戏就黑屏,这个就浪费了测试组的精力,如果要测试多款产品的话,就会因为黑屏问题做很多无用功,这是程序就需要在发给测试的时候自己先测试产品会不会黑屏.同样 ...

  5. 05 . Python入门值循环语句

    一.Python循环语句 程序一般情况下是按照顺序执行的 编程语言提供了各种控制结构,允许更复杂的执行路径 Python中的循环语句有for和while但没有do while 循环语句允许我们执行一个 ...

  6. bypass disable_function的方法及蚁剑插件bypass-php-function使用

    bypass disable_function的方法及蚁剑插件bypass-php-function使用 在学习php时,发现有许多函数会对网站或系统造成很大危险隐患,常见的危险函数有: phpinf ...

  7. Java实现 LeetCode 780 到达终点(逻辑题)

    780. 到达终点 从点 (x, y) 可以转换到 (x, x+y) 或者 (x+y, y). 给定一个起点 (sx, sy) 和一个终点 (tx, ty),如果通过一系列的转换可以从起点到达终点,则 ...

  8. Java实现 LeetCode 552 学生出勤记录 II(数学转换?还是动态规划?)

    552. 学生出勤记录 II 给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值. 学生出勤记录是只包含以下三个字符的 ...

  9. Java实现 LeetCode 459 重复的子字符串

    459. 重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" ...

  10. Java实现 LeetCode 260 只出现一次的数字 III(三)

    260. 只出现一次的数字 III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出 ...