之前自己實現過一個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