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 | 38 | #region Execute |
39 | 39 | public static object Execute(object o1 = null, object o2 = null) |
40 | 40 | { |
41 | + ServerConnectionPool.Init(); | |
41 | 42 | var args = (o1 as Menu.ExecutorParameter).Args; |
42 | 43 | var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION); |
43 | 44 | |
... | ... | @@ -910,7 +911,7 @@ GO |
910 | 911 | menufct.ClearMenuItemList(); |
911 | 912 | foreach (var def in defList) |
912 | 913 | { |
913 | - var st = SQLDataBaseManagerCore.CollectDataBaseInfo(def); | |
914 | + var st = def.CollectInfo(); | |
914 | 915 | menufct.AddMenuItem(new Menu.Item(def.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st))); |
915 | 916 | } |
916 | 917 | if (!silent) { menufct.DisplayItems(1); } |
... | ... | @@ -921,14 +922,15 @@ GO |
921 | 922 | private static object DisplayDataBaseInfo(object obj, int lineix) |
922 | 923 | { |
923 | 924 | SQLDataBase st = (obj as Menu.ExecutorParameter).Parameters as SQLDataBase; |
925 | + //SQLDataBaseManagerCore.GetPhysicalFilesLocationAndSize(st.SQLCS,out string dbsizetext,out string dbpathtext); | |
924 | 926 | if (lineix == 0) |
925 | 927 | { |
926 | 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 | 930 | ColorConsole.Write(st.Status.ToString(), statuscolor, bracket: "[]", prefix: " ", suffix: ". "); |
929 | 931 | ColorConsole.Write(st.DBName, statuscolor, bracket: "[]", prefix: "Database ", suffix: ". "); |
930 | 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 | 936 | if (st.Xml_IsRemoteDB) { ColorConsole.Write("REMOTE", ConsoleColor.Cyan, bracket: "[]", prefix: "", suffix: ""); } |
... | ... | @@ -949,15 +951,13 @@ GO |
949 | 951 | } |
950 | 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 | 955 | ColorConsole.WriteLine(" "); |
955 | 956 | return " "; |
956 | 957 | } |
957 | 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 | 961 | ColorConsole.WriteLine(" "); |
962 | 962 | return " "; |
963 | 963 | } |
... | ... | @@ -980,29 +980,6 @@ GO |
980 | 980 | #region class SQLDataBaseManager |
981 | 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 | 983 | public static void RelocatePhysicalFiles(SQLDataBase sqld, string targetdirectory, string restoredbname) |
1007 | 984 | { |
1008 | 985 | var dbbackupfilepath = CreateBackup(sqld, false,null); |
... | ... | @@ -1055,7 +1032,7 @@ GO |
1055 | 1032 | Server sqlserver = null; |
1056 | 1033 | try |
1057 | 1034 | { |
1058 | - var sc = GetSqlConnection(sqlcs, "master"); | |
1035 | + var sc = ServerConnectionPool.GetSqlConnection(sqlcs, "master"); | |
1059 | 1036 | sqlserver = SQLServerConnect(sc);if (sqlserver == null) { return; } |
1060 | 1037 | |
1061 | 1038 | var smoRestore = new Restore(); |
... | ... | @@ -1261,9 +1238,8 @@ GO |
1261 | 1238 | } |
1262 | 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 | 1243 | // Create user |
1268 | 1244 | //USE [LearALM2] |
1269 | 1245 | //DROP USER[datareader] |
... | ... | @@ -1351,7 +1327,7 @@ GO |
1351 | 1327 | Server sqlserver = null; |
1352 | 1328 | try |
1353 | 1329 | { |
1354 | - var sc = GetSqlConnection(sqldbconnectionString,null, grantoruser, grantoruserpsw); | |
1330 | + var sc = ServerConnectionPool.GetSqlConnection(sqldbconnectionString,null, grantoruser, grantoruserpsw); | |
1355 | 1331 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return; |
1356 | 1332 | Login login = new Login(sqlserver, name); |
1357 | 1333 | login.LoginType = logintype; |
... | ... | @@ -1406,7 +1382,7 @@ GO |
1406 | 1382 | Server sqlserver = null; |
1407 | 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 | 1386 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return false; |
1411 | 1387 | if (sqlserver.Databases.Contains(databasename)) |
1412 | 1388 | { |
... | ... | @@ -1426,7 +1402,7 @@ GO |
1426 | 1402 | Dictionary<string, string> ReturnDict = new Dictionary<string, string>(); |
1427 | 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 | 1406 | sqlserver = SQLServerConnect(sc); if (sqlserver == null) return null; |
1431 | 1407 | |
1432 | 1408 | foreach (Database db in sqlserver.Databases) |
... | ... | @@ -1489,18 +1465,9 @@ GO |
1489 | 1465 | var sqlcb = new SqlConnectionStringBuilder(cs); |
1490 | 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 | 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 | 1472 | public static Server SQLServerConnect(SqlConnection sqlconnection) |
1506 | 1473 | { |
... | ... | @@ -1523,7 +1490,7 @@ GO |
1523 | 1490 | |
1524 | 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 | 1495 | var sc = new ServerConnection(sqlc); |
1529 | 1496 | var srvr = new Server(sc); |
... | ... | @@ -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 | 1502 | #region DBSubstitution |
1598 | 1503 | public enum DBSubstitutionName |
1599 | 1504 | { |
1600 | 1505 | DBKEY,DATABASE,DATASOURCE,DBOTYPE,DBONAME,DBDATAGROUP,BACKUPTS,SHRINKOPTION,SHRINKFREESPACEPERCENT, |
1601 | 1506 | } |
1602 | 1507 | #endregion DBSubstitution |
1508 | + | |
1603 | 1509 | #region ExecuteSQLScript |
1604 | 1510 | /// <summary> |
1605 | 1511 | /// Egy SQL script végrehajtása (GO-val lezárt batch-eket tartalmazhat) |
... | ... | @@ -1621,66 +1527,55 @@ GO |
1621 | 1527 | /// </returns> |
1622 | 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 | 1580 | #endregion ExecuteSQLScript |
1686 | 1581 | #region ExecuteSQLStoredProcedure |
... | ... | @@ -1722,18 +1617,17 @@ GO |
1722 | 1617 | |
1723 | 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 | 1622 | var sqlcommand = sqlc.CreateCommand(); |
1728 | 1623 | sqlcommand.Connection = sqlc; |
1729 | 1624 | sqlcommand.CommandText = storedprocedurename; |
1730 | 1625 | sqlcommand.CommandTimeout = commandtimeout; |
1731 | 1626 | sqlcommand.CommandType = System.Data.CommandType.StoredProcedure; |
1732 | 1627 | //var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand); |
1733 | - sqlc.Open(); | |
1734 | 1628 | foreach (var p in SPparameters) |
1735 | 1629 | { |
1736 | - var sqlparameter = new Microsoft.Data.SqlClient.SqlParameter() | |
1630 | + var sqlparameter = new SqlParameter() | |
1737 | 1631 | { |
1738 | 1632 | ParameterName = p.Name, |
1739 | 1633 | SqlDbType = p.Type, |
... | ... | @@ -2077,7 +1971,7 @@ GO |
2077 | 1971 | |
2078 | 1972 | public string DBName; |
2079 | 1973 | public string DataSource; |
2080 | - public SQLDataBaseManagerCore.SQLDBStatus Status; | |
1974 | + public SQLDBStatus Status; | |
2081 | 1975 | public string PhysicalFilesDirectoryPath; |
2082 | 1976 | public string SizeString; |
2083 | 1977 | public string SQLCS |
... | ... | @@ -2085,6 +1979,81 @@ GO |
2085 | 1979 | get { return XmlProcessing.ConnectionStringStore.GetSQL(this.Xml_SQLConnectionString); } |
2086 | 1980 | } |
2087 | 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 | 2058 | #region basic constructor |
2090 | 2059 | public SQLDataBase() { } |
... | ... | @@ -2265,4 +2234,45 @@ GO |
2265 | 2234 | #endregion SQLData class |
2266 | 2235 | } |
2267 | 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 | 32 | // You can specify all the values or you can default the Build and Revision Numbers |
33 | 33 | // by using the '*' as shown below: |
34 | 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")] | ... | ... |