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.pswp.cn/news/285416.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285416.shtml
英文地址,請注明出處:http://en.pswp.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() …