Log4net + Dapper + Stored Procedures + Views + Functions + Triggers (edit)
1/ NuGet packages
- Microsoft .NET Framework 4.5
- Log4net version 2.0.8
- Dapper version 1.50.2
2/ Properties\AssemblyInfo.cs
Snippet
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
3/ App.config
Snippet
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <connectionStrings> <add name="MyConnectionString" connectionString="Data Source=MANHNV;Initial Catalog=Northwind;Uid=sa;Pwd=123456;" providerName="System.Data.SqlClient" /> </connectionStrings> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <log4net> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="ConsoleApp1.log" /> <appendToFile value="true" /> <encoding value="UTF-8" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="5" /> <maximumFileSize value="5MB" /> <staticLogFileName value="true" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%date{dd-MM-yy HH:mm:ss} %-5level %message%newline" /> </layout> </appender> <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date{dd-MM-yy HH:mm:ss} %-5level %message%newline" /> </layout> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-5level %message%newline" /> </layout> </appender> <root> <level value="All" /> <appender-ref ref="RollingFileAppender" /> <appender-ref ref="TraceAppender" /> <appender-ref ref="ConsoleAppender" /> </root> </log4net> </configuration>
4/ Program.cs
Snippet
using Dapper; using log4net; using log4net.Config; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static string m_ConnectionString = @" Data Source=MANHNV; Initial Catalog=Northwind; Uid=sa; Pwd=123456; "; const string sqlStoredProcedure = @" SELECT db_name() AS the__database , OBJECT_SCHEMA_NAME(P.object_id) AS the__schema , P.name AS procedure__name , C.text AS procedure__text , C.colid FROM sys.procedures P WITH(NOLOCK) LEFT JOIN sys.syscomments C ON P.object_id = C.id;"; const string sqlFunction = @" SELECT ROUTINE_NAME, ROUTINE_TYPE, ROUTINE_DEFINITION , ROUTINE_SCHEMA, DATA_TYPE, CREATED FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE' "; const string sqlView = @" SELECT SCHEMA_NAME(schema_id) AS schema_name , name AS view_name , OBJECTPROPERTYEX(OBJECT_ID, 'IsIndexed') AS IsIndexed , OBJECTPROPERTYEX(OBJECT_ID, 'IsIndexable') AS IsIndexable FROM sys.views; "; static void Main(string[] args) { //6 ways to get the current directory in C# //https://yetanotherchris.dev/csharp/6-ways-to-get-the-current-directory-in-csharp/ string basePathStoredProcedures = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Constants.StoredProcedures); string basePathFunction = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Constants.Functions); string basePathView = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Constants.Views); //How to: Create a File or Folder (C# Programming Guide) //https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-create-a-file-or-folder System.IO.Directory.CreateDirectory(basePathStoredProcedures); System.IO.Directory.CreateDirectory(basePathFunction); System.IO.Directory.CreateDirectory(basePathView); //Console.WriteLine(basePath); int totalCount = 0; using (IDbConnection db = new SqlConnection(m_ConnectionString)) { var listProc = db.Query<StoredProcDto>(sqlStoredProcedure, CommandType.StoredProcedure).ToList(); var listUniqueProcName = (from x in listProc select x.procedure__name).ToList(); totalCount = 0; Console.WriteLine(); Console.WriteLine("Work with the Stored Procedures"); Logger.Log.Info("Work with the Stored Procedures"); foreach (var procName in listUniqueProcName) { try { string fileName = procName.Trim().Replace("_", "") + Constants.SqlExtension; string filePath = System.IO.Path.Combine(basePathStoredProcedures, fileName); string storedProcedureText = string.Join("", listProc.Where(m => m.procedure__name == procName).Select(m => m.procedure__text).ToList()); System.IO.File.WriteAllText(filePath, storedProcedureText); totalCount += 1; } catch (Exception ex) { Logger.Log.Error(ex.ToString()); } } Console.WriteLine(string.Format("Backup total {0} stored procedures successfully!", totalCount)); /* * Process for Functions */ var listFunction = db.Query<FunctionDto>(sqlFunction, CommandType.StoredProcedure).ToList(); var listUniqueFunctionName = (from x in listFunction select x.ROUTINE_NAME).ToList(); totalCount = 0; Console.WriteLine(); Console.WriteLine("Work with the Functions"); Logger.Log.Info("Work with the Functions"); foreach (var functionName in listUniqueFunctionName) { try { string fileName = functionName.Trim().Replace("_", "") + Constants.SqlExtension; string filePath = System.IO.Path.Combine(basePathFunction, fileName); string functionText = string.Join("", listFunction.Where(m => m.ROUTINE_NAME == functionName).Select(m => m.ROUTINE_DEFINITION).ToList()); System.IO.File.WriteAllText(filePath, functionText); totalCount += 1; } catch (Exception ex) { Logger.Log.Error(ex.ToString()); } } Console.WriteLine(string.Format("Backup total {0} functions successfully!", totalCount)); /* * Process for View */ var listView = db.Query<ViewDto>(sqlView, CommandType.StoredProcedure).ToList(); var listUniqueViewName = (from x in listView select string.Concat(x.schema_name, Constants.Dot, x.view_name)).ToList(); totalCount = 0; Console.WriteLine(); Console.WriteLine("Work with the Views"); Logger.Log.Info("Work with the Views"); foreach (var viewName in listUniqueViewName) { try { string sqlTextView = @" select definition from sys.objects o join sys.sql_modules m on m.object_id = o.object_id where o.object_id = object_id('" + viewName + @"') and o.type = 'V' "; string fileName = viewName.Trim().Replace("_", "") + Constants.SqlExtension; string filePath = System.IO.Path.Combine(basePathView, fileName); string viewText = db.Query<string>(sqlTextView).FirstOrDefault(); System.IO.File.WriteAllText(filePath, viewText); totalCount += 1; } catch (Exception ex) { Logger.Log.Error(ex.ToString()); } } Console.WriteLine(string.Format("Backup total {0} views successfully!", totalCount)); } Console.ReadKey(); } } public static class Constants { public const string SqlExtension = ".sql"; public const string StoredProcedures = "StoredProcedures"; public const string Functions = "Functions"; public const string Views = "Views"; public const string Dot = "."; } public class StoredProcDto { public string the__database { get; set; } public string the__schema { get; set; } public string procedure__name { get; set; } public string procedure__text { get; set; } public int colid { get; set; } } public class FunctionDto { public string ROUTINE_NAME { get; set; } public string ROUTINE_TYPE { get; set; } public string ROUTINE_DEFINITION { get; set; } public string ROUTINE_SCHEMA { get; set; } public string DATA_TYPE { get; set; } public DateTime CREATED { get; set; } } public class ViewDto { public string schema_name { get; set; } public string view_name { get; set; } public bool IsIndexed { get; set; } public bool IsIndexable { get; set; } } public class Logger { private static readonly ILog log = LogManager.GetLogger(typeof(Logger)); public static ILog Log { get { return Logger.log; } } } }