在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有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. [PHP学习教程 - 文件]001.高速读写大数据“二进制”文件,不必申请大内存(Byte Block)

    引言:读写大“二进制”文件,不必申请很大内存(fopen.fread.fwrite.fclose)!做到开源节流,提高速度! 每天告诉自己一次,『我真的很不错』.... 加速读写大文件,在实际工作过程 ...

  2. Python 每日一练(5)

    引言 Python每日一练又开始啦,今天的专题和Excel有关,主要是实现将txt文本中数据写入到Excel中,说来也巧,今天刚好学校要更新各团支部的人员信息,就借此直接把事情做了 主要对于三种数据类 ...

  3. 移动端适配-rem(新)

    概念 对于移动端开发来说,无可避免的就是直面各种设备不同分辨率和不同DPR(设备像素比)的问题,在此忽略其他兼容性问题的探讨. 移动端像素 设备像素(dp),也叫物理像素.指设备能控制显示的最小物理单 ...

  4. display有哪些值?说明他们的作用?

    inline(默认)— 内联 none — 隐藏 block — 显示.块级元素(单独占一行) inline-block — 行内块元素(不占整行) table — 表格显示 list-item — ...

  5. Java试题错题集01

    1.javac与java命令 两个命令 javac 和 java. javac 后面跟着的是java文件的文件名,例如 HelloWorld.java. 该命令用于将 java 源文件编译为 clas ...

  6. Java并发编程 (三) 项目准备

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.案例环境初始化 1.环境搭建与准备 Spring Boot 项目,https://start.spr ...

  7. 高性能可扩展mysql 笔记(二)用户模型设计、用户实体表结构设计、设计范式

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.用户模型设计 电商羡慕中用户模型的设计涉及以下几个部分: ​ 以电商平台京东的登录.注册页面作为例: ...

  8. Java实现 蓝桥杯 基础练习 特殊的数字

    基础练习 特殊的数字 时间限制:1.0s 内存限制:512.0MB 提交此题 锦囊1 锦囊2 问题描述 153是一个非常特殊的数,它等于它的每位数字的立方和,即153=111+555+333.编程求所 ...

  9. Java实现 蓝桥杯 算式最大值

    算式最大值 [问题描述] 给定: 1)N个正整数A1, A2, - AN; 2)P个加号+和Q个减号-; (P+Q=N-1) 3)K对括号() 请你使用全部整数.加减号和括号,组成一个合法的算式(A1 ...

  10. 第七届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第 ...