Commit acc7abdacdda58ceab3b0d3b82a919e32de4fff0
1 parent
84e2de26
v1.2.3.0
- SQL Table backup script esetén a hibakezelés javítása
Showing
4 changed files
with
91 additions
and
40 deletions
Show diff stats
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs
| @@ -233,4 +233,44 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -233,4 +233,44 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 233 | return ""; | 233 | return ""; |
| 234 | } | 234 | } |
| 235 | } | 235 | } |
| 236 | + | ||
| 237 | + #region StringExtension class | ||
| 238 | + public static class StringExtension | ||
| 239 | + { | ||
| 240 | + /// <summary> | ||
| 241 | + /// Behelyezzesíti a megadott stringben előforduló Environment.SpecialFolder enum neveket | ||
| 242 | + /// az Environment.GetFolderPath által visszadott tényleges értékükre | ||
| 243 | + /// </summary> | ||
| 244 | + /// <param name="s"></param> | ||
| 245 | + /// <param name="n"></param> | ||
| 246 | + /// <returns></returns> | ||
| 247 | + public static string SubstituteSpecialFolderName(this string s, Environment.SpecialFolder n) { return s.Replace("@" + n.ToString() + "@", Environment.GetFolderPath(n)); } | ||
| 248 | + } | ||
| 249 | + #endregion StringExtension class | ||
| 250 | + | ||
| 251 | + #region ExceptionExtension class | ||
| 252 | + public static class ExceptionExtension | ||
| 253 | + { | ||
| 254 | + /// <summary> | ||
| 255 | + /// Az exception és belső exceptionjeinek összefűzése | ||
| 256 | + /// </summary> | ||
| 257 | + /// <param name="ex"></param> | ||
| 258 | + /// <returns></returns> | ||
| 259 | + public static string MessageNested(this Exception ex) | ||
| 260 | + { | ||
| 261 | + string rexmsg = ""; | ||
| 262 | + string indent = ""; | ||
| 263 | + const string indentof1level = " "; | ||
| 264 | + Exception excl = ex; | ||
| 265 | + while (true) | ||
| 266 | + { | ||
| 267 | + rexmsg += indent + excl.Message; | ||
| 268 | + excl = excl.InnerException; | ||
| 269 | + indent += (indent==""?"\n":"")+indentof1level; | ||
| 270 | + if (excl == null) { break; } | ||
| 271 | + } | ||
| 272 | + return rexmsg.Replace("\n\n","\n"); | ||
| 273 | + } | ||
| 274 | + } | ||
| 275 | + #endregion ExceptionExtension class | ||
| 236 | } | 276 | } |
Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs
| @@ -103,7 +103,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | @@ -103,7 +103,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | ||
| 103 | BackupPackageManagerCore.CreatePackageFile(bp, tempfolderpath, vars); | 103 | BackupPackageManagerCore.CreatePackageFile(bp, tempfolderpath, vars); |
| 104 | if (Directory.Exists(tempfolderpath)) { Directory.Delete(tempfolderpath,true); } | 104 | if (Directory.Exists(tempfolderpath)) { Directory.Delete(tempfolderpath,true); } |
| 105 | } | 105 | } |
| 106 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 106 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 107 | } | 107 | } |
| 108 | #endregion First level Executors with UI | 108 | #endregion First level Executors with UI |
| 109 | 109 | ||
| @@ -486,28 +486,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | @@ -486,28 +486,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | ||
| 486 | private string SpecialFolderNameSubstitution(string path) | 486 | private string SpecialFolderNameSubstitution(string path) |
| 487 | { | 487 | { |
| 488 | return path | 488 | return path |
| 489 | - .R(Environment.SpecialFolder.ApplicationData)// Current User's Application Data | ||
| 490 | - .R(Environment.SpecialFolder.CommonApplicationData) // All User's Application Data | ||
| 491 | - .R(Environment.SpecialFolder.CommonProgramFiles) // Program Files | ||
| 492 | - .R(Environment.SpecialFolder.Cookies) // Internet Cookie | ||
| 493 | - .R(Environment.SpecialFolder.Desktop) // Logical Desktop | ||
| 494 | - .R(Environment.SpecialFolder.DesktopDirectory) // Physical Desktop | ||
| 495 | - .R(Environment.SpecialFolder.Favorites) // Favorites | ||
| 496 | - .R(Environment.SpecialFolder.History) // Internet History | ||
| 497 | - .R(Environment.SpecialFolder.InternetCache) // Internet Cache | ||
| 498 | - .R(Environment.SpecialFolder.MyComputer) // "My Computer" Folder | ||
| 499 | - .R(Environment.SpecialFolder.MyDocuments) // "My Documents" Folder | ||
| 500 | - .R(Environment.SpecialFolder.MyMusic) // "My Music" Folder | ||
| 501 | - .R(Environment.SpecialFolder.MyPictures) // "My Pictures" Folder | ||
| 502 | - .R(Environment.SpecialFolder.Personal) // "My Document" Folder | ||
| 503 | - .R(Environment.SpecialFolder.ProgramFiles) // Program files Folder | ||
| 504 | - .R(Environment.SpecialFolder.Programs) // Programs Folder | ||
| 505 | - .R(Environment.SpecialFolder.Recent) // Recent Folder | ||
| 506 | - .R(Environment.SpecialFolder.SendTo) // "Sent to" Folder | ||
| 507 | - .R(Environment.SpecialFolder.StartMenu) // Start Menu | ||
| 508 | - .R(Environment.SpecialFolder.Startup) // Startup | ||
| 509 | - .R(Environment.SpecialFolder.System) // System Folder | ||
| 510 | - .R(Environment.SpecialFolder.Templates) // Document Templates | 489 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.ApplicationData)// Current User's Application Data |
| 490 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.CommonApplicationData) // All User's Application Data | ||
| 491 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.CommonProgramFiles) // Program Files | ||
| 492 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.Cookies) // Internet Cookie | ||
| 493 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.Desktop) // Logical Desktop | ||
| 494 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.DesktopDirectory) // Physical Desktop | ||
| 495 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.Favorites) // Favorites | ||
| 496 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.History) // Internet History | ||
| 497 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.InternetCache) // Internet Cache | ||
| 498 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyComputer) // "My Computer" Folder | ||
| 499 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyDocuments) // "My Documents" Folder | ||
| 500 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyMusic) // "My Music" Folder | ||
| 501 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyPictures) // "My Pictures" Folder | ||
| 502 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.Personal) // "My Document" Folder | ||
| 503 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.ProgramFiles) // Program files Folder | ||
| 504 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.Programs) // Programs Folder | ||
| 505 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.Recent) // Recent Folder | ||
| 506 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.SendTo) // "Sent to" Folder | ||
| 507 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.StartMenu) // Start Menu | ||
| 508 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.Startup) // Startup | ||
| 509 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.System) // System Folder | ||
| 510 | + .SubstituteSpecialFolderName(Environment.SpecialFolder.Templates) // Document Templates | ||
| 511 | ; | 511 | ; |
| 512 | } | 512 | } |
| 513 | } | 513 | } |
| @@ -537,9 +537,5 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | @@ -537,9 +537,5 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | ||
| 537 | #endregion BackupSQLDataBase class | 537 | #endregion BackupSQLDataBase class |
| 538 | 538 | ||
| 539 | } | 539 | } |
| 540 | - public static class StringExtension | ||
| 541 | - { | ||
| 542 | - public static string R(this string s, Environment.SpecialFolder n) { return s.Replace("@" + n.ToString() + "@", Environment.GetFolderPath(n)); } | ||
| 543 | - } | ||
| 544 | #endregion BackupPackage class | 540 | #endregion BackupPackage class |
| 545 | } | 541 | } |
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
| @@ -862,11 +862,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -862,11 +862,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 862 | 862 | ||
| 863 | 863 | ||
| 864 | List<string> backupfilepathlist = new List<string>(); | 864 | List<string> backupfilepathlist = new List<string>(); |
| 865 | - foreach (var sqldata in sqld.Xml_SQLDataList) | 865 | + foreach (var sqldata in sqld.Xml_SQLDataList) |
| 866 | { | 866 | { |
| 867 | vars[nameof(DBSubstitutionName.DBDATAGROUP)] = sqldata.Group; | 867 | vars[nameof(DBSubstitutionName.DBDATAGROUP)] = sqldata.Group; |
| 868 | - var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars); | 868 | + var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars,out List<string> errormessageList); |
| 869 | backupfilepathlist.AddRange(sqlfilescreated); | 869 | backupfilepathlist.AddRange(sqlfilescreated); |
| 870 | + if (errormessageList != null && errormessageList.Any()) { foreach (var emsg in errormessageList) { ColorConsole.WriteLine("\n"+emsg, ConsoleColor.Red); } } | ||
| 870 | } | 871 | } |
| 871 | 872 | ||
| 872 | if (createZip) | 873 | if (createZip) |
| @@ -876,8 +877,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -876,8 +877,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 876 | } | 877 | } |
| 877 | } | 878 | } |
| 878 | } | 879 | } |
| 879 | - private static List<string> ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List<string> tablenamelist, Dictionary<string, string> vars) | 880 | + private static List<string> ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List<string> tablenamelist, Dictionary<string, string> vars,out List<string> errormessageList) |
| 880 | { | 881 | { |
| 882 | + errormessageList = new List<string>(); | ||
| 881 | string filename =null , filefullname=null, lastfilefullname = null; | 883 | string filename =null , filefullname=null, lastfilefullname = null; |
| 882 | var myscripter = new Microsoft.SqlServer.Management.Smo.Scripter(); | 884 | var myscripter = new Microsoft.SqlServer.Management.Smo.Scripter(); |
| 883 | myscripter.Server = sqlserver; | 885 | myscripter.Server = sqlserver; |
| @@ -900,6 +902,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -900,6 +902,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 900 | var backupfilelist = new List<string>(); | 902 | var backupfilelist = new List<string>(); |
| 901 | var urnstoscript = new UrnCollection(); | 903 | var urnstoscript = new UrnCollection(); |
| 902 | var deletefromlist = new List<string>(); | 904 | var deletefromlist = new List<string>(); |
| 905 | + string errmsg; | ||
| 906 | + bool success; | ||
| 903 | foreach (var tn in tablenamelist) | 907 | foreach (var tn in tablenamelist) |
| 904 | { | 908 | { |
| 905 | string tn_dbname = tn.Split('.')[0]; | 909 | string tn_dbname = tn.Split('.')[0]; |
| @@ -911,7 +915,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -911,7 +915,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 911 | filefullname = Path.Combine(backupdirectorypath, filename); | 915 | filefullname = Path.Combine(backupdirectorypath, filename); |
| 912 | if (lastfilefullname!=filefullname && lastfilefullname!=null) | 916 | if (lastfilefullname!=filefullname && lastfilefullname!=null) |
| 913 | { | 917 | { |
| 914 | - backupfilelist.Add(CreateOneSqlFile(urnstoscript, deletefromlist,sqlserver, myscripter, lastfilefullname)); | 918 | + success = CreateOneSqlFile(urnstoscript, deletefromlist, sqlserver, myscripter, lastfilefullname, out errmsg); |
| 919 | + if (success) { backupfilelist.Add(lastfilefullname); } else { errormessageList.Add(errmsg);} | ||
| 915 | lastfilefullname = filefullname; | 920 | lastfilefullname = filefullname; |
| 916 | deletefromlist.Clear(); | 921 | deletefromlist.Clear(); |
| 917 | urnstoscript.Clear(); | 922 | urnstoscript.Clear(); |
| @@ -922,17 +927,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -922,17 +927,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 922 | urnstoscript.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(urnstring)); | 927 | urnstoscript.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(urnstring)); |
| 923 | lastfilefullname = filefullname; | 928 | lastfilefullname = filefullname; |
| 924 | } | 929 | } |
| 925 | - backupfilelist.Add(CreateOneSqlFile(urnstoscript, deletefromlist,sqlserver,myscripter,filefullname)); | 930 | + success = CreateOneSqlFile(urnstoscript, deletefromlist, sqlserver, myscripter, filefullname,out errmsg); |
| 931 | + if (success) { backupfilelist.Add(filefullname); } else { errormessageList.Add(errmsg); } | ||
| 926 | return backupfilelist; | 932 | return backupfilelist; |
| 927 | } | 933 | } |
| 928 | - private static string CreateOneSqlFile( UrnCollection urnstoscript,List<string> deletefromlist,Server sqlserver,Scripter myscripter, string sqlfilefullname) | 934 | + private static bool CreateOneSqlFile( UrnCollection urnstoscript,List<string> deletefromlist,Server sqlserver,Scripter myscripter, string sqlfilefullname,out string errormessage) |
| 929 | { | 935 | { |
| 936 | + errormessage = null; | ||
| 930 | myscripter.Options.FileName = sqlfilefullname; | 937 | myscripter.Options.FileName = sqlfilefullname; |
| 931 | - if (urnstoscript.Any()) { myscripter.EnumScript(urnstoscript); } | ||
| 932 | - var scripttext = File.ReadAllText(sqlfilefullname); | ||
| 933 | - deletefromlist = deletefromlist.Prepend($"use [{sqlserver.ConnectionContext.DatabaseName}]").ToList(); | ||
| 934 | - File.WriteAllText(sqlfilefullname, string.Join("\r\n",deletefromlist) +"\r\n\r\n" + scripttext, Encoding.UTF8);//???????????????? | ||
| 935 | - return sqlfilefullname; | 938 | + try |
| 939 | + { | ||
| 940 | + if (urnstoscript.Any()) { myscripter.EnumScript(urnstoscript); } | ||
| 941 | + var scripttext = File.ReadAllText(sqlfilefullname); | ||
| 942 | + deletefromlist = deletefromlist.Prepend($"use [{sqlserver.ConnectionContext.DatabaseName}]").ToList(); | ||
| 943 | + File.WriteAllText(sqlfilefullname, string.Join("\r\n", deletefromlist) + "\r\n\r\n" + scripttext, Encoding.UTF8);//???????????????? | ||
| 944 | + return true; | ||
| 945 | + } | ||
| 946 | + catch (Exception ex) | ||
| 947 | + { | ||
| 948 | + errormessage=ex.MessageNested(); | ||
| 949 | + return false; | ||
| 950 | + } | ||
| 936 | } | 951 | } |
| 937 | #endregion BackupSqlData | 952 | #endregion BackupSqlData |
| 938 | #endregion private methods | 953 | #endregion private methods |
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
| @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | ||
| 32 | // You can specify all the values or you can default the Build and Revision Numbers | 32 | // You can specify all the values or you can default the Build and Revision Numbers |
| 33 | // by using the '*' as shown below: | 33 | // by using the '*' as shown below: |
| 34 | // [assembly: AssemblyVersion("1.0.*")] | 34 | // [assembly: AssemblyVersion("1.0.*")] |
| 35 | -[assembly: AssemblyVersion("1.2.2.0")] | ||
| 36 | -[assembly: AssemblyFileVersion("1.2.2.0")] | 35 | +[assembly: AssemblyVersion("1.2.3.0")] |
| 36 | +[assembly: AssemblyFileVersion("1.2.3.0")] |