System.CommandLine版CSRebot

之前自己实现过一个CSRebot命令行工具,现在用System.CommandLine来实现,就规范和省事多了,虽然System.CommandLine还没有正式发布,但它的实现思路还是很不错的。

下面的代码只简单实现了MSSQL库生成C#体类的功能,其他库或其他语言的实体类生成,大家可以自己实现一下,以熟悉System.CommandLine的使用。

直接上代码了:

using Microsoft.Data.SqlClient;
using System.CommandLine;
using System.CommandLine.Binding;
using System.Data;
using System.Text;
using System;//创建根命令
var rootCommand = new RootCommand("这是一款C#开发辅助工具,CSRebot");
rootCommand.SetHandler(() =>
{Console.WriteLine("老桂欢迎您使用CSRebot!");Console.ForegroundColor = ConsoleColor.Green;Console.WriteLine("\r\n   ___________ ____       __          __ \r\n  / ____/ ___// __ \\___  / /_  ____  / /_\r\n / /    \\__ \\/ /_/ / _ \\/ __ \\/ __ \\/ __/\r\n/ /___ ___/ / _, _/  __/ /_/ / /_/ / /_  \r\n\\____//____/_/ |_|\\___/_.___/\\____/\\__/  \r\n                                         \r\n");Console.ResetColor();Console.WriteLine("help command:csrebot -h");Console.WriteLine();
});
//创建子命令 show
var dbtoCommand = new Command("dbto", "从数据库生成");#region 选项 language
//创建子命令选项 language 别名 lan
var languageOption = new Option<string>(name: "--language", description: "从数据库生成实体类的语言")
{IsRequired = true,
}.FromAmong("c#", "C#", "csharp", "CSharp", "go", "GO", "java", "JAVA");
languageOption.AddAlias("-lan");
languageOption.AddAlias("-l");
//添加language选项到dbto命令中
dbtoCommand.AddOption(languageOption);
#endregion#region connestionString
//创建子命令选项 connestionString 别名 constr
var connectionStringOption = new Option<string>(name: "--connectionstring", description: "数据库连接字符串")
{IsRequired = true,
};
connectionStringOption.AddAlias("-constr");//添加language选项到dbto命令中
dbtoCommand.AddOption(connectionStringOption);
#endregion#region dbtype
//创建子命令选项 connestionString 别名 constr
var dbTypeOption = new Option<string>(name: "--dbtype", description: "数据库类型")
{IsRequired = true,
}.FromAmong("mssql", "mysql", "pgsql"); ;
dbTypeOption.AddAlias("-dbt");
dbTypeOption.AddAlias("-t");
//添加language选项到dbto命令中
dbtoCommand.AddOption(dbTypeOption);
#endregion//设置命令dbto执行的动作,这是带上language参数
dbtoCommand.SetHandler(async (string language, string connectionstring, string dbType) =>
{switch (language.ToLower()){case "c#":case "csharp":await DBToCSharpAsync(connectionstring, dbType);break;case "go":break;case "java":break;default:break;}
}, languageOption, connectionStringOption, dbTypeOption);//添加命令dbto到 根命令中
rootCommand.Add(dbtoCommand);
await rootCommand.InvokeAsync(args);static async Task DBToCSharpAsync(string connectionString, string dbType)
{switch (dbType.ToLower()){case "mssql":await MSSQLToCSharpAsync(connectionString);break;default:break;}
}static async Task MSSQLToCSharpAsync(string connectionString)
{using var con = new SqlConnection(connectionString);using var cmd = new SqlCommand("select name from sysobjects where xtype='U'", con);await con.OpenAsync();using var reader = await cmd.ExecuteReaderAsync();var tableNames = new List<string>();while (reader.Read()){tableNames.Add(reader.GetString(0));}await reader.CloseAsync();var dbPath = $"{Environment.CurrentDirectory}\\{con.Database}";if (!Directory.Exists(dbPath)){Directory.CreateDirectory(dbPath);}foreach (var tableName in tableNames){using var fileCmd = new SqlCommand("SELECT syscolumns.name,systypes.name as typename FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id(@tablename)", con);fileCmd.Parameters.Add("tablename", SqlDbType.VarChar).Value = tableName;using var fileReader = await fileCmd.ExecuteReaderAsync();var tablefieldses = new List<dynamic>();while (fileReader.Read()){tablefieldses.Add(new { name = fileReader.GetString(0), typename = fileReader.GetString(1) });}fileReader.Close();await fileReader.DisposeAsync();var csBuilder = new StringBuilder();csBuilder.AppendLine($"public class {tableName}");csBuilder.AppendLine("{");foreach (var tablefields in tablefieldses){var typeName = TypeMap.MSSQLToCSharp[tablefields.typename];var name = tablefields.name;csBuilder.AppendLine($"   public {typeName} {name}{{get;set;}}");}csBuilder.AppendLine("}");File.WriteAllText($"{dbPath}\\{tableName}.cs", csBuilder.ToString(), Encoding.UTF8);}
}static class TypeMap
{internal static Dictionary<string, string> MSSQLToCSharp => new Dictionary<string, string>{{"bigint","long"},{"binary","byte[]"},{"bit","bool"},{"char","string"},{"date","DateTime"},{"datetime","DateTime"},{"datetime2","DateTime"},{"datetimeoffset","DateTimeOffset" },{"decimal","decimal" },{"float","double" },{"image","byte[]" },{"int","int" },{"money","decimal" },{"nchar","string" },{"ntext","string" },{"numeric","decimal" },{"nvarchar","string" },{"real","float" },{"rowversion","byte[]" },{"smalldatetime","DateTime" },{"smallint","short" },{"smallmoney","decimal" },{"sql_variant","object"},{"text","string" },{"time","TimeSpan" },{"timestamp","byte[]" },{"tinyint","byte" },{"uniqueidentifier","Guid" },{"varbinary","byte[]" },{"varchar","string" },};internal static Dictionary<string, string> MySQLToCSharp => new Dictionary<string, string>{{"","" }};internal static Dictionary<string, string> PgSQLToCSharp => new Dictionary<string, string>{{"","" }};
}

安装CSRebot

完成后,选中项目并打包,然后进入项目所有的文件夹执行工具安装命令

dotnet tool install -g --add-source ./nupkg CSRebot

测试

csrebot dbto -l C# -constr 'server=localhost;database=库名;uid=用户名;pwd=密码;encrypt=true;trustservercertificate=true' -t mssql

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell重定向

Liunx下系统打开的3个文件&#xff0c;即标准输入、标注输出和标准错误输出。用户的shell将键盘设为默认的标准输入&#xff0c;默认的标准输入和标准错误输出为屏幕。也就是说&#xff0c;用户从键盘输入命令&#xff0c;然后将结果和错误消息输入到屏幕所谓的重定向&#xff…

【CASS精品教程】CASS 9.2 for AutoCAD2014启动提示文件加载,怎么处理?

CASS9.2在安装完后,首次启动会提示如下图样提示,应该如何处理?请看以下步骤: 解决步骤: 1、安装完CASS9.2_2014后,首次启动CASS92,会出现如下图所示提示。选择“不加载”。 2、进入AutoCAD系统配置—系统页面 打开系统页面菜单 系统界面截图

VS2015不能修改安装路径问题

能修改安装路径&#xff0c;固态硬盘空间太小&#xff0c;所以不能装在C盘啊。 其中&#xff0c;原因是以前安装过VS2015没有卸载干净&#xff0c;解决方法是&#xff1a;下载Visual Studio Uninstaller卸载完全&#xff08;要以管理员运行哈&#xff09; 下载地址&#xff1a;…

python 绘制分形树

# -*- coding: utf8 -*- """ 绘制分形树 """ import turtledeflection_angle 20 # 树枝与树干夹角 trunk_min_length 5 # 树干最小长度 trunk_step_length 10 # 树干每次递减长度 trunk_length 80 # 初…

像JAVA一样流畅调试C#源代码?

起因最近在研究ServiceScope的内一些内在运行逻辑,发现相关资料非常少&#xff0c;只有讲IOC相关的文章有说Core时代的官方依赖注入怎么使用。。遂决定还是要去看源代码。这部分源代码在Microsoft.Extensions.DependencyInjection库中&#xff0c;源代码位置在src/libraries[1]…

物化视图VS普通视图

2019独角兽企业重金招聘Python工程师标准>>> 物化视图是一种特殊的物理表&#xff0c;“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表&#xff0c;应用的局限性大&#xff0c;任何对视图的查询&#xff0c;Oracle都实际上转换为视图SQL语句的查…

【CASS精品教程】CASS绘图软件入门初级教程超详细资料

文章目录 第一章 CASS 9.0简介第二章 CASS 9.0快速入门第三章 测制地形图第四章 测制地籍图第五章 土地详查与勘测定界第六章 CASS在数据入库中的应用第七章 CASS 9.0在工程中的应用第八章 数字地图管理第九章 CASS在市政监管中的应用第十章 白纸图数字化第十一章电子平板成图第…

多兼容的JS获取鼠标坐标

//第一、相对于屏幕 function getMousePos(event) {var e event || window.event;return {x:e.screenX,y:screenY} } //第二、相对于浏览器 function getMousePos(event) {var e event || window.event;return {x:e.clientX,y:clientY} }//第三、相对于文档 function getM…

aws-ec2-双网卡问题

问题描述 在已存在的EC2上新添加网卡后发现&#xff0c;凡是和eth0在同一个网段的只能通过eth0访问&#xff0c;不能通过eth1。同样的&#xff0c;在eth1网段的只能通过eth1访问&#xff0c;不能通过eth0访问。 如果既不在eth0也不再eth0 默认走eth0(在没有修改路由表的前提下&…

EditPlust 批量添加自定义工具

先将插件文件***.js文件放到指定目录&#xff0c;比如editplus的安装下新文件夹tools。 &#xff08;下载地址见文末&#xff09; 将下列代码内容另存为tool_u.ini 文件&#xff08;不能改名&#xff09;&#xff0c; 放到EditPlus 的ini文件目录 &#xff08;工具-设置目录 可…

iOS c语言 基本运算符

2019独角兽企业重金招聘Python工程师标准>>> iOS_06_基本运算符 一、算术运算 c语言一共有34种运算符&#xff0c;包括了常见的加减乘除 1.加法运算 # 除了能做加法运算&#xff0c;还能表示正号&#xff1a;5、90 2.减法运算- # 除了能做减法运算&#xff0c;还能表…

【CASS精品教程】CASS快捷键大全吐血整理

A——画弧(ARC) AA——给实体加地物名 B——自由连接 C——画圆(CIRCLE) COPYCLIP——从不同窗口复制局部 CP——拷贝(COPY) D——绘制电力线 DD——通用绘图命令 DDPTYPE——改变点形状 E——删除(ERASE) F——图形复制 FF——绘制多点房屋 G——绘制高程点 H——线型…

Maui学习之路(三)--Winui3深入探讨

Maui的学习之路 --- Winui3深入探讨学习Maui已经有一段时间&#xff0c;随着不断地深入&#xff0c;对Maui有了一些初步的了解。我们都知道Maui为了保持平台原生特性&#xff0c;所以在每一个平台都使用了平台自身的原生开发框架&#xff0c;如在Windows系统使用了Winui3作为UI…

centos 7.1 apache 源码编译安装

Apache编译安装 一&#xff0c;需要软件&#xff1a; http://mirrors.cnnic.cn/apache//apr/apr-1.5.2.tar.gz 1.apr-1.5.2.tar.gz http://mirrors.cnnic.cn/apache//apr/apr-util-1.5.4.tar.gz 2.apr-util-1.5.4.tar.gz http://exim.mirror.fr/pcre/pcre-8.38.tar.gz 3.pcre-8…

【ArcGIS风暴】ArcGIS平台上点云(.las)数据生成等高线方法案例精解

las是点云数据常见的存储格式,摄影测量和激光雷达数据均采用此格式,点云数据常用来生成等高线,地籍测量,土方量计算等。本文讲解在ArcGIS平台上生成等高线并转换为dwg格式供CASS使用。 扩展阅读: 什么是点云?什么是Las数据集?一篇文章告诉你点云数据的奥秘 ArcGIS+CASS点…

通过两级网关设计来路由服务网格流量

编者的话本文是来自笔者的公司 Tetrate[1] 工程师 Petr McAllister 的分享&#xff0c;Tetrate 的拳头产品是 Tetrate Service Bridge[2]&#xff08;下文简称 TSB&#xff09;&#xff0c;它是在开源的 Istio 和 Envoy 基础上构建的&#xff0c;但为其增加了管理平面。简介Tet…

各个线程顺序循环执行

问题描述&#xff1a;A任务执行完之后执行B任务&#xff0c;B任务执行之后再执行C任务&#xff0c;C任务执行完之后A再执行任务&#xff0c;以此循环下去 Task 1 package com.ydd.work.concurrent;2 3 import java.util.concurrent.atomic.AtomicInteger;4 /**5 * 6 * author…

python类相关

class A:def bar(self):print("BAR")self.f1() class B(A):def f1(self):print("B") class C:def f1(self):print("C") class D(C,B):pass obj D() obj.bar() # 创建了类A、B、C、D&#xff1b; # D继承了C和B&#xff0c;B继承了A&#xff0c;…

Python File 介绍

Open() 方法 Python open() 方法用于打开一个文件&#xff0c;并返回文件对象&#xff0c;在对文件进行处理过程都需要使用到这个函数&#xff0c;如果该文件无法被打开&#xff0c;会抛出 OSError。 注意&#xff1a;使用 open() 方法一定要保证关闭文件对象&#xff0c;即调用…

H5开发中常用的js方法

2019独角兽企业重金招聘Python工程师标准>>> h5和app之间的webview交互 这是常用的交互方法之一&#xff0c;iOS可以使用WKWebView,安卓可以使用JsBridge,完成常见的交互效果。function webViewHandler(iosCallback, adrCallback) {if (getMobileOperatingSystem() …