Commit eeb190f8d8889739a5ae33d96cd3347f9c6ca019
1 parent
eca09089
v1.27.2.0
- DB lista előállításának gyorsítása
Showing
2 changed files
with
178 additions
and
168 deletions
Show diff stats
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
@@ -38,6 +38,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -38,6 +38,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
38 | #region Execute | 38 | #region Execute |
39 | public static object Execute(object o1 = null, object o2 = null) | 39 | public static object Execute(object o1 = null, object o2 = null) |
40 | { | 40 | { |
41 | + ServerConnectionPool.Init(); | ||
41 | var args = (o1 as Menu.ExecutorParameter).Args; | 42 | var args = (o1 as Menu.ExecutorParameter).Args; |
42 | var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION); | 43 | var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION); |
43 | 44 | ||
@@ -910,7 +911,7 @@ GO | @@ -910,7 +911,7 @@ GO | ||
910 | menufct.ClearMenuItemList(); | 911 | menufct.ClearMenuItemList(); |
911 | foreach (var def in defList) | 912 | foreach (var def in defList) |
912 | { | 913 | { |
913 | - var st = SQLDataBaseManagerCore.CollectDataBaseInfo(def); | 914 | + var st = def.CollectInfo(); |
914 | menufct.AddMenuItem(new Menu.Item(def.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st))); | 915 | menufct.AddMenuItem(new Menu.Item(def.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st))); |
915 | } | 916 | } |
916 | if (!silent) { menufct.DisplayItems(1); } | 917 | if (!silent) { menufct.DisplayItems(1); } |
@@ -921,14 +922,15 @@ GO | @@ -921,14 +922,15 @@ GO | ||
921 | private static object DisplayDataBaseInfo(object obj, int lineix) | 922 | private static object DisplayDataBaseInfo(object obj, int lineix) |
922 | { | 923 | { |
923 | SQLDataBase st = (obj as Menu.ExecutorParameter).Parameters as SQLDataBase; | 924 | SQLDataBase st = (obj as Menu.ExecutorParameter).Parameters as SQLDataBase; |
925 | + //SQLDataBaseManagerCore.GetPhysicalFilesLocationAndSize(st.SQLCS,out string dbsizetext,out string dbpathtext); | ||
924 | if (lineix == 0) | 926 | if (lineix == 0) |
925 | { | 927 | { |
926 | ColorConsole.Write($"{st.Xml_Description}", ConsoleColor.Black, ConsoleColor.White); | 928 | ColorConsole.Write($"{st.Xml_Description}", ConsoleColor.Black, ConsoleColor.White); |
927 | - var statuscolor = st.Status == SQLDataBaseManagerCore.SQLDBStatus.NoAccess ? ConsoleColor.Red:ConsoleColor.Green; | 929 | + var statuscolor = st.Status == SQLDataBase.SQLDBStatus.NoAccess ? ConsoleColor.Red:ConsoleColor.Green; |
928 | ColorConsole.Write(st.Status.ToString(), statuscolor, bracket: "[]", prefix: " ", suffix: ". "); | 930 | ColorConsole.Write(st.Status.ToString(), statuscolor, bracket: "[]", prefix: " ", suffix: ". "); |
929 | ColorConsole.Write(st.DBName, statuscolor, bracket: "[]", prefix: "Database ", suffix: ". "); | 931 | ColorConsole.Write(st.DBName, statuscolor, bracket: "[]", prefix: "Database ", suffix: ". "); |
930 | ColorConsole.Write(st.DataSource, statuscolor, bracket: "[]", prefix: "from server ", suffix: ". "); | 932 | ColorConsole.Write(st.DataSource, statuscolor, bracket: "[]", prefix: "from server ", suffix: ". "); |
931 | - if (st.Status != SQLDataBaseManagerCore.SQLDBStatus.NoAccess) | 933 | + if (st.Status != SQLDataBase.SQLDBStatus.NoAccess) |
932 | { | 934 | { |
933 | } | 935 | } |
934 | if (st.Xml_IsRemoteDB) { ColorConsole.Write("REMOTE", ConsoleColor.Cyan, bracket: "[]", prefix: "", suffix: ""); } | 936 | if (st.Xml_IsRemoteDB) { ColorConsole.Write("REMOTE", ConsoleColor.Cyan, bracket: "[]", prefix: "", suffix: ""); } |
@@ -949,15 +951,13 @@ GO | @@ -949,15 +951,13 @@ GO | ||
949 | } | 951 | } |
950 | else if (lineix == 3) | 952 | else if (lineix == 3) |
951 | { | 953 | { |
952 | - var phypath = (SQLDataBaseManagerCore.GetPhysicalFilesLocation(st.SQLCS))??"ERR"; | ||
953 | - ColorConsole.Write($"{phypath}", ConsoleColor.Yellow, prefix: "DB files physical location:", suffix: " "); | 954 | + ColorConsole.Write($"{st.PhysicalFilesDirectoryPath}", ConsoleColor.Yellow, prefix: "DB files physical location:", suffix: " "); |
954 | ColorConsole.WriteLine(" "); | 955 | ColorConsole.WriteLine(" "); |
955 | return " "; | 956 | return " "; |
956 | } | 957 | } |
957 | else if (lineix == 4) | 958 | else if (lineix == 4) |
958 | { | 959 | { |
959 | - var dbsize = SQLDataBaseManagerCore.GetSize(st.SQLCS); | ||
960 | - ColorConsole.Write(dbsize, ConsoleColor.Yellow, prefix: "DB size:", suffix: " "); | 960 | + ColorConsole.Write(st.SizeString, ConsoleColor.Yellow, prefix: "DB size:", suffix: " "); |
961 | ColorConsole.WriteLine(" "); | 961 | ColorConsole.WriteLine(" "); |
962 | return " "; | 962 | return " "; |
963 | } | 963 | } |
@@ -980,29 +980,6 @@ GO | @@ -980,29 +980,6 @@ GO | ||
980 | #region class SQLDataBaseManager | 980 | #region class SQLDataBaseManager |
981 | public static class SQLDataBaseManagerCore | 981 | public static class SQLDataBaseManagerCore |
982 | { | 982 | { |
983 | - #region public CollectDataBaseInfo | ||
984 | - public static SQLDataBase CollectDataBaseInfo(SQLDataBase sqld) | ||
985 | - { | ||
986 | - try | ||
987 | - { | ||
988 | - sqld.PhysicalFilesDirectoryPath = (GetPhysicalFilesLocation(sqld.SQLCS)) ?? ""; | ||
989 | - sqld.Status = string.IsNullOrWhiteSpace(sqld.PhysicalFilesDirectoryPath)? SQLDBStatus.NoAccess: SQLDBStatus.OK; | ||
990 | - sqld.DBName = GetDBName(sqld.SQLCS); | ||
991 | - sqld.DataSource = GetDataSource(sqld.SQLCS); | ||
992 | - sqld.SizeString = GetSize(sqld.SQLCS); | ||
993 | - } | ||
994 | - catch | ||
995 | - { | ||
996 | - sqld.Status = SQLDBStatus.NoAccess; | ||
997 | - sqld.PhysicalFilesDirectoryPath = ""; | ||
998 | - sqld.DBName = GetDBName(sqld.SQLCS); | ||
999 | - sqld.DataSource = GetDataSource(sqld.SQLCS); | ||
1000 | - sqld.SizeString = ""; | ||
1001 | - } | ||
1002 | - return sqld; | ||
1003 | - } | ||
1004 | - #endregion public CollectDataBaseInfo | ||
1005 | - | ||
1006 | public static void RelocatePhysicalFiles(SQLDataBase sqld, string targetdirectory, string restoredbname) | 983 | public static void RelocatePhysicalFiles(SQLDataBase sqld, string targetdirectory, string restoredbname) |
1007 | { | 984 | { |
1008 | var dbbackupfilepath = CreateBackup(sqld, false,null); | 985 | var dbbackupfilepath = CreateBackup(sqld, false,null); |
@@ -1055,7 +1032,7 @@ GO | @@ -1055,7 +1032,7 @@ GO | ||
1055 | Server sqlserver = null; | 1032 | Server sqlserver = null; |
1056 | try | 1033 | try |
1057 | { | 1034 | { |
1058 | - var sc = GetSqlConnection(sqlcs, "master"); | 1035 | + var sc = ServerConnectionPool.GetSqlConnection(sqlcs, "master"); |
1059 | sqlserver = SQLServerConnect(sc);if (sqlserver == null) { return; } | 1036 | sqlserver = SQLServerConnect(sc);if (sqlserver == null) { return; } |
1060 | 1037 | ||
1061 | var smoRestore = new Restore(); | 1038 | var smoRestore = new Restore(); |
@@ -1261,9 +1238,8 @@ GO | @@ -1261,9 +1238,8 @@ GO | ||
1261 | } | 1238 | } |
1262 | public static void CreateUser(string sqldbconnectionString, string dbusername, string dbrolenamecommalist,string loginname) | 1239 | public static void CreateUser(string sqldbconnectionString, string dbusername, string dbrolenamecommalist,string loginname) |
1263 | { | 1240 | { |
1264 | - using (SqlConnection connection = new SqlConnection(sqldbconnectionString)) | 1241 | + using (SqlConnection connection = ServerConnectionPool.GetSqlConnection(sqldbconnectionString,open:true)) |
1265 | { | 1242 | { |
1266 | - connection.Open(); | ||
1267 | // Create user | 1243 | // Create user |
1268 | //USE [LearALM2] | 1244 | //USE [LearALM2] |
1269 | //DROP USER[datareader] | 1245 | //DROP USER[datareader] |
@@ -1351,7 +1327,7 @@ GO | @@ -1351,7 +1327,7 @@ GO | ||
1351 | Server sqlserver = null; | 1327 | Server sqlserver = null; |
1352 | try | 1328 | try |
1353 | { | 1329 | { |
1354 | - var sc = GetSqlConnection(sqldbconnectionString,null, grantoruser, grantoruserpsw); | 1330 | + var sc = ServerConnectionPool.GetSqlConnection(sqldbconnectionString,null, grantoruser, grantoruserpsw); |
1355 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return; | 1331 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return; |
1356 | Login login = new Login(sqlserver, name); | 1332 | Login login = new Login(sqlserver, name); |
1357 | login.LoginType = logintype; | 1333 | login.LoginType = logintype; |
@@ -1406,7 +1382,7 @@ GO | @@ -1406,7 +1382,7 @@ GO | ||
1406 | Server sqlserver = null; | 1382 | Server sqlserver = null; |
1407 | try | 1383 | try |
1408 | { | 1384 | { |
1409 | - var sc = GetSqlConnection(cs, dbname:databasename, userid: userid, userpassword: password); | 1385 | + var sc = ServerConnectionPool.GetSqlConnection(cs, dbname:databasename, userid: userid, userpassword: password); |
1410 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return false; | 1386 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return false; |
1411 | if (sqlserver.Databases.Contains(databasename)) | 1387 | if (sqlserver.Databases.Contains(databasename)) |
1412 | { | 1388 | { |
@@ -1426,7 +1402,7 @@ GO | @@ -1426,7 +1402,7 @@ GO | ||
1426 | Dictionary<string, string> ReturnDict = new Dictionary<string, string>(); | 1402 | Dictionary<string, string> ReturnDict = new Dictionary<string, string>(); |
1427 | try | 1403 | try |
1428 | { | 1404 | { |
1429 | - var sc = GetSqlConnection(cs, dbname: null, userid: userid, userpassword: password); | 1405 | + var sc = ServerConnectionPool.GetSqlConnection(cs, dbname: null, userid: userid, userpassword: password); |
1430 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return null; | 1406 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return null; |
1431 | 1407 | ||
1432 | foreach (Database db in sqlserver.Databases) | 1408 | foreach (Database db in sqlserver.Databases) |
@@ -1489,18 +1465,9 @@ GO | @@ -1489,18 +1465,9 @@ GO | ||
1489 | var sqlcb = new SqlConnectionStringBuilder(cs); | 1465 | var sqlcb = new SqlConnectionStringBuilder(cs); |
1490 | return sqlcb.DataSource; | 1466 | return sqlcb.DataSource; |
1491 | } | 1467 | } |
1492 | - public enum SQLDBStatus { NoAccess, OK, } | ||
1493 | - public static SqlConnection GetSqlConnection(string sqlconnectionstring, string dbname = null, string userid = null, string userpassword = null) | ||
1494 | - { | ||
1495 | - var scb = new SqlConnectionStringBuilder(sqlconnectionstring); | ||
1496 | - if (!string.IsNullOrWhiteSpace(dbname)) { scb.InitialCatalog = dbname; } | ||
1497 | - if (!string.IsNullOrWhiteSpace(userid) && !string.IsNullOrWhiteSpace(userpassword)) { scb.UserID = userid; scb.Password = userpassword; } | ||
1498 | - else if (!string.IsNullOrWhiteSpace(userid) && string.IsNullOrWhiteSpace(userpassword)) { scb.UserID= userid; scb.IntegratedSecurity= true; } | ||
1499 | - return new SqlConnection(scb.ToString()); | ||
1500 | - } | ||
1501 | public static Server SQLServerConnect(string sqlconnectionstring,string dbname=null) | 1468 | public static Server SQLServerConnect(string sqlconnectionstring,string dbname=null) |
1502 | { | 1469 | { |
1503 | - return SQLServerConnect(GetSqlConnection(sqlconnectionstring, dbname)); | 1470 | + return SQLServerConnect(ServerConnectionPool.GetSqlConnection(sqlconnectionstring, dbname)); |
1504 | } | 1471 | } |
1505 | public static Server SQLServerConnect(SqlConnection sqlconnection) | 1472 | public static Server SQLServerConnect(SqlConnection sqlconnection) |
1506 | { | 1473 | { |
@@ -1523,7 +1490,7 @@ GO | @@ -1523,7 +1490,7 @@ GO | ||
1523 | 1490 | ||
1524 | public static void ShrinkDB(string sqlconnectionstring, ShrinkMethod shrinkmethod,int freespacepercent) | 1491 | public static void ShrinkDB(string sqlconnectionstring, ShrinkMethod shrinkmethod,int freespacepercent) |
1525 | { | 1492 | { |
1526 | - using (var sqlc = new SqlConnection(sqlconnectionstring)) | 1493 | + using (var sqlc =ServerConnectionPool.GetSqlConnection(sqlconnectionstring,open:false)) |
1527 | { | 1494 | { |
1528 | var sc = new ServerConnection(sqlc); | 1495 | var sc = new ServerConnection(sqlc); |
1529 | var srvr = new Server(sc); | 1496 | var srvr = new Server(sc); |
@@ -1532,74 +1499,13 @@ GO | @@ -1532,74 +1499,13 @@ GO | ||
1532 | } | 1499 | } |
1533 | } | 1500 | } |
1534 | 1501 | ||
1535 | - #region GetSize | ||
1536 | - /// <summary> | ||
1537 | - /// Visszadja a megadott adatbázis méretét | ||
1538 | - /// </summary> | ||
1539 | - /// <param name="sqlconnectionstring"></param> | ||
1540 | - /// <returns></returns> | ||
1541 | - public static string GetSize(string sqlconnectionstring) | ||
1542 | - { | ||
1543 | - try | ||
1544 | - { | ||
1545 | - using (var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring)) | ||
1546 | - { | ||
1547 | - var dbname = GetDBName(sqlconnectionstring); | ||
1548 | - | ||
1549 | - var getsizecmd = new Microsoft.Data.SqlClient.SqlCommand("sp_spaceused", sqlc); | ||
1550 | - getsizecmd.CommandType = System.Data.CommandType.StoredProcedure; | ||
1551 | - sqlc.Open(); | ||
1552 | - var reader = getsizecmd.ExecuteReader(); | ||
1553 | - | ||
1554 | - if (reader.HasRows) | ||
1555 | - { | ||
1556 | - while (reader.Read()) | ||
1557 | - { | ||
1558 | - var dbn = reader["database_name"]; | ||
1559 | - var dbs = reader["database_size"]; | ||
1560 | - if (Convert.ToString(dbn) == dbname) { return Convert.ToString(dbs); }; | ||
1561 | - } | ||
1562 | - } | ||
1563 | - sqlc.Close(); | ||
1564 | - } | ||
1565 | - return "N/A"; | ||
1566 | - } | ||
1567 | - catch { return "ERR"; } | ||
1568 | - } | ||
1569 | - #endregion GetSize | ||
1570 | - | ||
1571 | - #region GetPhysicalFilesLocation | ||
1572 | - /// <summary> | ||
1573 | - /// Returns the physical path to the directory that holds the files of the database | ||
1574 | - /// </summary> | ||
1575 | - /// <param name="sqlconnectionstring"></param> | ||
1576 | - /// <returns>the path, or null, if any error occurs</returns> | ||
1577 | - public static string GetPhysicalFilesLocation(string sqlconnectionstring) | ||
1578 | - { | ||
1579 | - try | ||
1580 | - { | ||
1581 | - int commandtimeout = 5000; | ||
1582 | - string scripttext = ""; | ||
1583 | - scripttext += " DECLARE @physicalpath varchar(1000) = NULL;"; | ||
1584 | - scripttext += " SELECT @physicalpath = f.physical_name"; | ||
1585 | - scripttext += " FROM sys.master_files as f inner join sys.databases as d on f.database_id = d.database_id"; | ||
1586 | - scripttext += " where d.name = '{DATABASE}' and f.type_desc = 'ROWS';"; | ||
1587 | - scripttext += " SELECT 1 AS RETURNCODE, @physicalpath AS RETURNMESSAGE;"; | ||
1588 | - var vars = new Dictionary<string, string>(); | ||
1589 | - vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlconnectionstring)); | ||
1590 | - vars.Add(nameof(DBSubstitutionName.DATASOURCE), ""); | ||
1591 | - var result = ExecuteSQLScript(sqlconnectionstring, scripttext, commandtimeout, vars); | ||
1592 | - if (result.ReturnValue != 0) { return Path.GetDirectoryName(result.ReturnMessage); } else { return null; }; | ||
1593 | - } | ||
1594 | - catch { return null; } | ||
1595 | - } | ||
1596 | - #endregion GetPhysicalFilesLocation | ||
1597 | #region DBSubstitution | 1502 | #region DBSubstitution |
1598 | public enum DBSubstitutionName | 1503 | public enum DBSubstitutionName |
1599 | { | 1504 | { |
1600 | DBKEY,DATABASE,DATASOURCE,DBOTYPE,DBONAME,DBDATAGROUP,BACKUPTS,SHRINKOPTION,SHRINKFREESPACEPERCENT, | 1505 | DBKEY,DATABASE,DATASOURCE,DBOTYPE,DBONAME,DBDATAGROUP,BACKUPTS,SHRINKOPTION,SHRINKFREESPACEPERCENT, |
1601 | } | 1506 | } |
1602 | #endregion DBSubstitution | 1507 | #endregion DBSubstitution |
1508 | + | ||
1603 | #region ExecuteSQLScript | 1509 | #region ExecuteSQLScript |
1604 | /// <summary> | 1510 | /// <summary> |
1605 | /// Egy SQL script végrehajtása (GO-val lezárt batch-eket tartalmazhat) | 1511 | /// Egy SQL script végrehajtása (GO-val lezárt batch-eket tartalmazhat) |
@@ -1621,66 +1527,55 @@ GO | @@ -1621,66 +1527,55 @@ GO | ||
1621 | /// </returns> | 1527 | /// </returns> |
1622 | public static ReturnInfoJSON ExecuteSQLScript(string sqlconnectionstring, string sqltxt, int commandtimeout, Dictionary<string, string> vars) | 1528 | public static ReturnInfoJSON ExecuteSQLScript(string sqlconnectionstring, string sqltxt, int commandtimeout, Dictionary<string, string> vars) |
1623 | { | 1529 | { |
1624 | - using (var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring)) | ||
1625 | - { | ||
1626 | - sqltxt = VRH.Common.StringConstructor.ResolveConstructorR(vars, sqltxt, "{}@@"); | ||
1627 | - | ||
1628 | - sqlc.Open(); | ||
1629 | - string SQLBatchTxt = ""; // ebben lesznek az sql script-en belüli batch-ek összerakva | ||
1630 | - int SQLBatchIndex = 0; // az aktuális batch indexe | ||
1631 | - int scriptlineindex = 0; // az aktuális script sor indexe | ||
1632 | - System.Data.DataSet DataSet = null; // ebben lesz az eredmény (az utolsó batch eredménye) | ||
1633 | - sqltxt += "\r\nGO";// ha esetleg nem lenne, odatesszük a végére az utolsó batch-et lezáró GO-t | ||
1634 | - foreach (var scriptline in sqltxt.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)) | 1530 | + using (var sqlc = ServerConnectionPool.GetSqlConnection(sqlconnectionstring,open:true)) { return ExecuteSQLScript(sqlc,sqltxt, commandtimeout, vars); } |
1531 | + } | ||
1532 | + public static ReturnInfoJSON ExecuteSQLScript(SqlConnection sqlconnection, string sqltxt, int commandtimeout, Dictionary<string, string> vars) | ||
1533 | + { | ||
1534 | + sqltxt = VRH.Common.StringConstructor.ResolveConstructorR(vars, sqltxt, "{}@@"); | ||
1535 | + | ||
1536 | + var connectionwasopen = true; | ||
1537 | + if (sqlconnection.State != System.Data.ConnectionState.Open) { ServerConnectionPool.Open(sqlconnection); connectionwasopen = false; } | ||
1538 | + string SQLBatchTxt = ""; // ebben lesznek az sql script-en belüli batch-ek összerakva | ||
1539 | + int SQLBatchIndex = 0; // az aktuális batch indexe | ||
1540 | + int scriptlineindex = 0; // az aktuális script sor indexe | ||
1541 | + System.Data.DataSet DataSet = null; // ebben lesz az eredmény (az utolsó batch eredménye) | ||
1542 | + sqltxt += "\r\nGO";// ha esetleg nem lenne, odatesszük a végére az utolsó batch-et lezáró GO-t | ||
1543 | + foreach (var scriptline in sqltxt.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)) | ||
1544 | + { | ||
1545 | + scriptlineindex += 1; | ||
1546 | + if (Regex.Match(scriptline, @"^GO$").Success)// a batch utolső sora | ||
1635 | { | 1547 | { |
1636 | - scriptlineindex += 1; | ||
1637 | - if (Regex.Match(scriptline, @"^GO$").Success)// a batch utolső sora | ||
1638 | - { | ||
1639 | - if (!string.IsNullOrWhiteSpace(SQLBatchTxt)) | ||
1640 | - { | ||
1641 | - SQLBatchIndex += 1; | ||
1642 | - DataSet = ExecuteSQLScriptBatch(sqlc, SQLBatchTxt, commandtimeout); | ||
1643 | - SQLBatchTxt = ""; | ||
1644 | - } | ||
1645 | - } | ||
1646 | - else if (!string.IsNullOrWhiteSpace(scriptline)) | 1548 | + if (!string.IsNullOrWhiteSpace(SQLBatchTxt)) |
1647 | { | 1549 | { |
1648 | - SQLBatchTxt += scriptline + "\r\n"; | 1550 | + SQLBatchIndex += 1; |
1551 | + var sqlcommand = sqlconnection.CreateCommand(); | ||
1552 | + sqlcommand.CommandText = SQLBatchTxt; | ||
1553 | + sqlcommand.CommandTimeout = commandtimeout; | ||
1554 | + var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand); | ||
1555 | + DataSet = new System.Data.DataSet(); | ||
1556 | + DataAdapter.Fill(DataSet); | ||
1557 | + SQLBatchTxt = ""; | ||
1649 | } | 1558 | } |
1650 | } | 1559 | } |
1651 | - | ||
1652 | - sqlc.Close(); | ||
1653 | - try | 1560 | + else if (!string.IsNullOrWhiteSpace(scriptline)) |
1654 | { | 1561 | { |
1655 | - var firstreturnedtable = DataSet.Tables[0]; | ||
1656 | - var firstreturnedrow = firstreturnedtable.Rows[0]; | ||
1657 | - var firstreturnedvalue = firstreturnedrow[0]; | ||
1658 | - var secondreturnedvalue = firstreturnedrow[1]; | ||
1659 | - var rv = Convert.ToInt32(firstreturnedvalue); | ||
1660 | - var rm = Convert.ToString(secondreturnedvalue); | ||
1661 | - return new ReturnInfoJSON() { ReturnValue = rv, ReturnMessage = rm, }; | 1562 | + SQLBatchTxt += scriptline + "\r\n"; |
1662 | } | 1563 | } |
1663 | - catch { } | ||
1664 | } | 1564 | } |
1665 | - return new ReturnInfoJSON() { ReturnValue = 0, ReturnMessage = null, }; | ||
1666 | - } | ||
1667 | 1565 | ||
1668 | - /// <summary> | ||
1669 | - /// Egy SQL batch végrehajtása | ||
1670 | - /// </summary> | ||
1671 | - /// <param name="sqlc"></param> | ||
1672 | - /// <param name="sqlbatchtxt"></param> | ||
1673 | - /// <param name="commandtimeout"></param> | ||
1674 | - /// <returns></returns> | ||
1675 | - private static System.Data.DataSet ExecuteSQLScriptBatch(Microsoft.Data.SqlClient.SqlConnection sqlc, string sqlbatchtxt, int commandtimeout) | ||
1676 | - { | ||
1677 | - var sqlcommand = sqlc.CreateCommand(); | ||
1678 | - sqlcommand.CommandText = sqlbatchtxt; | ||
1679 | - sqlcommand.CommandTimeout = commandtimeout; | ||
1680 | - var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand); | ||
1681 | - var DataSet = new System.Data.DataSet(); | ||
1682 | - DataAdapter.Fill(DataSet); | ||
1683 | - return DataSet; | 1566 | + if (!connectionwasopen) { sqlconnection.Close(); } |
1567 | + try | ||
1568 | + { | ||
1569 | + var firstreturnedtable = DataSet.Tables[0]; | ||
1570 | + var firstreturnedrow = firstreturnedtable.Rows[0]; | ||
1571 | + var firstreturnedvalue = firstreturnedrow[0]; | ||
1572 | + var secondreturnedvalue = firstreturnedrow[1]; | ||
1573 | + var rv = Convert.ToInt32(firstreturnedvalue); | ||
1574 | + var rm = Convert.ToString(secondreturnedvalue); | ||
1575 | + return new ReturnInfoJSON() { ReturnValue = rv, ReturnMessage = rm, }; | ||
1576 | + } | ||
1577 | + catch { } | ||
1578 | + return new ReturnInfoJSON() { ReturnValue = 0, ReturnMessage = null, }; | ||
1684 | } | 1579 | } |
1685 | #endregion ExecuteSQLScript | 1580 | #endregion ExecuteSQLScript |
1686 | #region ExecuteSQLStoredProcedure | 1581 | #region ExecuteSQLStoredProcedure |
@@ -1722,18 +1617,17 @@ GO | @@ -1722,18 +1617,17 @@ GO | ||
1722 | 1617 | ||
1723 | public static List<SPparameter> ExecuteSQLStoredProcedure(string sqlconnectionstring, string storedprocedurename, int commandtimeout, List<SPparameter> SPparameters) | 1618 | public static List<SPparameter> ExecuteSQLStoredProcedure(string sqlconnectionstring, string storedprocedurename, int commandtimeout, List<SPparameter> SPparameters) |
1724 | { | 1619 | { |
1725 | - using (var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring)) | ||
1726 | - { | 1620 | + using (var sqlc = ServerConnectionPool.GetSqlConnection(sqlconnectionstring,open:true)) |
1621 | + { | ||
1727 | var sqlcommand = sqlc.CreateCommand(); | 1622 | var sqlcommand = sqlc.CreateCommand(); |
1728 | sqlcommand.Connection = sqlc; | 1623 | sqlcommand.Connection = sqlc; |
1729 | sqlcommand.CommandText = storedprocedurename; | 1624 | sqlcommand.CommandText = storedprocedurename; |
1730 | sqlcommand.CommandTimeout = commandtimeout; | 1625 | sqlcommand.CommandTimeout = commandtimeout; |
1731 | sqlcommand.CommandType = System.Data.CommandType.StoredProcedure; | 1626 | sqlcommand.CommandType = System.Data.CommandType.StoredProcedure; |
1732 | //var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand); | 1627 | //var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand); |
1733 | - sqlc.Open(); | ||
1734 | foreach (var p in SPparameters) | 1628 | foreach (var p in SPparameters) |
1735 | { | 1629 | { |
1736 | - var sqlparameter = new Microsoft.Data.SqlClient.SqlParameter() | 1630 | + var sqlparameter = new SqlParameter() |
1737 | { | 1631 | { |
1738 | ParameterName = p.Name, | 1632 | ParameterName = p.Name, |
1739 | SqlDbType = p.Type, | 1633 | SqlDbType = p.Type, |
@@ -2077,7 +1971,7 @@ GO | @@ -2077,7 +1971,7 @@ GO | ||
2077 | 1971 | ||
2078 | public string DBName; | 1972 | public string DBName; |
2079 | public string DataSource; | 1973 | public string DataSource; |
2080 | - public SQLDataBaseManagerCore.SQLDBStatus Status; | 1974 | + public SQLDBStatus Status; |
2081 | public string PhysicalFilesDirectoryPath; | 1975 | public string PhysicalFilesDirectoryPath; |
2082 | public string SizeString; | 1976 | public string SizeString; |
2083 | public string SQLCS | 1977 | public string SQLCS |
@@ -2085,6 +1979,81 @@ GO | @@ -2085,6 +1979,81 @@ GO | ||
2085 | get { return XmlProcessing.ConnectionStringStore.GetSQL(this.Xml_SQLConnectionString); } | 1979 | get { return XmlProcessing.ConnectionStringStore.GetSQL(this.Xml_SQLConnectionString); } |
2086 | } | 1980 | } |
2087 | #endregion fields | 1981 | #endregion fields |
1982 | + public enum SQLDBStatus { NoAccess, OK, } | ||
1983 | + | ||
1984 | + #region CollectInfo | ||
1985 | + public SQLDataBase CollectInfo() | ||
1986 | + { | ||
1987 | + try | ||
1988 | + { | ||
1989 | + GetPhysicalFilesLocationAndSize(this.SQLCS, out this.SizeString, out this.PhysicalFilesDirectoryPath); | ||
1990 | + this.Status = this.PhysicalFilesDirectoryPath=="ERR" ? SQLDBStatus.NoAccess : SQLDBStatus.OK; | ||
1991 | + this.DBName = SQLDataBaseManagerCore.GetDBName(this.SQLCS); | ||
1992 | + this.DataSource = SQLDataBaseManagerCore.GetDataSource(this.SQLCS); | ||
1993 | + } | ||
1994 | + catch | ||
1995 | + { | ||
1996 | + this.Status = SQLDBStatus.NoAccess; | ||
1997 | + this.PhysicalFilesDirectoryPath = ""; | ||
1998 | + this.DBName = SQLDataBaseManagerCore.GetDBName(this.SQLCS); | ||
1999 | + this.DataSource = SQLDataBaseManagerCore.GetDataSource(this.SQLCS); | ||
2000 | + this.SizeString = ""; | ||
2001 | + } | ||
2002 | + return this; | ||
2003 | + } | ||
2004 | + #endregion CollectInfo | ||
2005 | + | ||
2006 | + #region GetPhysicalFilesLocationAndSize | ||
2007 | + /// <summary> | ||
2008 | + /// Visszadja a megadott adatbázis méretét | ||
2009 | + /// </summary> | ||
2010 | + /// <param name="sqlconnectionstring"></param> | ||
2011 | + /// <returns></returns> | ||
2012 | + private void GetPhysicalFilesLocationAndSize(string sqlconnectionstring, out string dbsizetext, out string dbpathtext) | ||
2013 | + { | ||
2014 | + dbsizetext = null; | ||
2015 | + dbpathtext = null; | ||
2016 | + try | ||
2017 | + { | ||
2018 | + var sqlc = ServerConnectionPool.GetSqlConnection(sqlconnectionstring,open:true); | ||
2019 | + string dbname = SQLDataBaseManagerCore.GetDBName(sqlconnectionstring); | ||
2020 | + try | ||
2021 | + { | ||
2022 | + var getsizecmd = new SqlCommand("sp_spaceused", sqlc); | ||
2023 | + getsizecmd.CommandType = System.Data.CommandType.StoredProcedure; | ||
2024 | + var reader = getsizecmd.ExecuteReader(); | ||
2025 | + | ||
2026 | + if (reader.HasRows) | ||
2027 | + { | ||
2028 | + while (reader.Read()) { if (Convert.ToString(reader["database_name"]) == dbname) { dbsizetext = Convert.ToString(reader["database_size"]); break; }; } | ||
2029 | + } | ||
2030 | + dbsizetext = dbsizetext ?? "N/A"; | ||
2031 | + } | ||
2032 | + catch { } | ||
2033 | + | ||
2034 | + try | ||
2035 | + { | ||
2036 | + int commandtimeout = 5000; | ||
2037 | + string scripttext = ""; | ||
2038 | + scripttext += " DECLARE @physicalpath varchar(1000) = NULL;"; | ||
2039 | + scripttext += " SELECT @physicalpath = f.physical_name"; | ||
2040 | + scripttext += " FROM sys.master_files AS f INNER JOIN sys.databases AS d ON f.database_id = d.database_id"; | ||
2041 | + scripttext += " WHERE d.name = '{DATABASE}' AND f.type_desc = 'ROWS';"; | ||
2042 | + scripttext += " SELECT 1 AS RETURNCODE, @physicalpath AS RETURNMESSAGE;"; | ||
2043 | + var vars = new Dictionary<string, string>(); | ||
2044 | + vars.Add(nameof(SQLDataBaseManagerCore.DBSubstitutionName.DATABASE), dbname); | ||
2045 | + vars.Add(nameof(SQLDataBaseManagerCore.DBSubstitutionName.DATASOURCE), ""); | ||
2046 | + var result = SQLDataBaseManagerCore.ExecuteSQLScript(sqlc, scripttext, commandtimeout, vars); | ||
2047 | + if (result.ReturnValue != 0) { dbpathtext = Path.GetDirectoryName(result.ReturnMessage); } | ||
2048 | + } | ||
2049 | + catch { } | ||
2050 | + sqlc.Close(); | ||
2051 | + } | ||
2052 | + catch { } | ||
2053 | + dbsizetext = dbsizetext ?? "ERR"; | ||
2054 | + dbpathtext = dbpathtext ?? "ERR"; | ||
2055 | + } | ||
2056 | + #endregion GetPhysicalFilesLocationAndSize | ||
2088 | 2057 | ||
2089 | #region basic constructor | 2058 | #region basic constructor |
2090 | public SQLDataBase() { } | 2059 | public SQLDataBase() { } |
@@ -2265,4 +2234,45 @@ GO | @@ -2265,4 +2234,45 @@ GO | ||
2265 | #endregion SQLData class | 2234 | #endregion SQLData class |
2266 | } | 2235 | } |
2267 | #endregion SQLDataBase class | 2236 | #endregion SQLDataBase class |
2237 | + | ||
2238 | + public static class ServerConnectionPool | ||
2239 | + { | ||
2240 | + private static List<string> InaccessibleConnectionList = new List<string>(); | ||
2241 | + public static SqlConnection GetSqlConnection(string sqlconnectionstring, string dbname = null, string userid = null, string userpassword = null,bool open=false) | ||
2242 | + { | ||
2243 | + var scb = new SqlConnectionStringBuilder(sqlconnectionstring); | ||
2244 | + if (!string.IsNullOrWhiteSpace(dbname)) { scb.InitialCatalog = dbname; } | ||
2245 | + if (!string.IsNullOrWhiteSpace(userid) && !string.IsNullOrWhiteSpace(userpassword)) { scb.UserID = userid; scb.Password = userpassword; } | ||
2246 | + else if (!string.IsNullOrWhiteSpace(userid) && string.IsNullOrWhiteSpace(userpassword)) { scb.UserID = userid; scb.IntegratedSecurity = true; } | ||
2247 | + var sqlc = new SqlConnection(scb.ToString()); | ||
2248 | + if (open) Open(sqlc); | ||
2249 | + return sqlc; | ||
2250 | + } | ||
2251 | + public static void Open(SqlConnection sqlc) | ||
2252 | + { | ||
2253 | + if (IsMasterInacessible(sqlc) || IsInacessible(sqlc)) | ||
2254 | + { | ||
2255 | + throw new Exception($"DB {sqlc.Database} on server {sqlc.DataSource} is inaccessible!"); | ||
2256 | + } | ||
2257 | + try { sqlc.Open(); } | ||
2258 | + catch (Exception ex) | ||
2259 | + { | ||
2260 | + MarkMasterInacessible(sqlc); | ||
2261 | + MarkInacessible(sqlc); | ||
2262 | + throw ex; | ||
2263 | + } | ||
2264 | + } | ||
2265 | + private static bool IsMasterDBConnected(SqlConnection sqlc) | ||
2266 | + { | ||
2267 | + try { (new SqlConnection((new SqlConnectionStringBuilder(sqlc.ConnectionString) { InitialCatalog = "master" }).ToString())).Open(); return true; } | ||
2268 | + catch { return false; } | ||
2269 | + } | ||
2270 | + private static string MasterDBId(SqlConnection sqlc) { return sqlc.DataSource + "#master"; } | ||
2271 | + private static string DBId(SqlConnection sqlc) { return sqlc.DataSource + "#" + sqlc.Database; } | ||
2272 | + private static bool IsInacessible(SqlConnection sqlc) { return InaccessibleConnectionList.Contains(DBId(sqlc)); } | ||
2273 | + private static bool IsMasterInacessible(SqlConnection sqlc) { return InaccessibleConnectionList.Contains(MasterDBId(sqlc)); } | ||
2274 | + private static void MarkInacessible(SqlConnection sqlc) { if (!IsInacessible(sqlc)) { InaccessibleConnectionList.Add(DBId(sqlc)); }} | ||
2275 | + private static void MarkMasterInacessible(SqlConnection sqlc) { if (!IsMasterInacessible(sqlc)) { InaccessibleConnectionList.Add(MasterDBId(sqlc)); } } | ||
2276 | + public static void Init() { InaccessibleConnectionList.Clear(); } | ||
2277 | + } | ||
2268 | } | 2278 | } |
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.27.1.0")] | ||
36 | -[assembly: AssemblyFileVersion("1.27.1.0")] | 35 | +[assembly: AssemblyVersion("1.27.2.0")] |
36 | +[assembly: AssemblyFileVersion("1.27.2.0")] |