/// <summary> /// Converts sql db objects of a connected SQL server database into an XML schema file. /// </summary> /// <param name="SQLServer">The string for the SQL server name to connect to.</param> /// <param name="DBName">The string for the SQL server database name to connect to.</param> /// <param name="UID">The string for the SQL server user login to use for the SqlConnections object.</param> /// <param name="PWD">The string for the SQL server user password to use for the SqlConnections object.</param> /// <param name="SQLfile">The SQL script file that will be translated from the create XML schema file.</param> /// <param name="Translate">A flag to cause the translation method to be called, thus creating the SQL script file /// specified with the SQLfile param.</param> /// <param name="Primary">A flag to force the FileGroups to only have Primary, no matter what the actual one is in /// the database.</param> /// <param name="threaded">Object that passes in a null or as bool</param> /// <param name="objectsToSerialize">bit mask of SQL objects to serialize - use the _nodetype enum</param> /// <param name="CustomXSLT">the full path and name of a custom xslt to be applied to the final xml output</param> /// <param name="delimTableNames">the comma delimited string of table names to be serialized</param> /// <returns>Returns the delimited ',' XML + SQL output filename(s)</returns> public static string SerializeDB( string SQLServer, string DBName, string UID, string PWD, string SQLfile, bool Translate, bool Primary, object threaded, byte objectsToSerialize, string CustomXSLT, string delimTableNames) { _threaded = threaded; string _serverDB = SQLServer + ":" + DBName; string outputFile = string.Format(_OUTPUTFILE, SQLServer.Replace("\\", "_").Replace(":", "-"), DBName.Replace("\\", "_").Replace(":", "-")); try { // TODO: add threads if this takes a long while SQLMethods.SQLConnections _connections; if (UID != null && PWD != null) { _connections = new SQLMethods.SQLConnections(SQLServer, DBName, UID, PWD, false); } else { _connections = new SQLMethods.SQLConnections(SQLServer, DBName); } if (_connections != null && _connections.Count > 0) { DataSet _ds = new DataSet("DataBase_Schema"); _ds.EnforceConstraints = false; DataTable dt = _ds.Tables.Add("Database"); dt.Columns.Add("Name"); dt.Columns.Add("Date"); dt.Columns.Add("Time"); DataRow dr = dt.NewRow(); dr.ItemArray = new object[] { DBName, DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString() }; dt.Rows.Add(dr); Sleep(); // get defaults, rules and UDDTs : in this order because of dependant behavior if ((objectsToSerialize & Convert.ToByte(_NodeType.DEFAULT)) == (int)_NodeType.DEFAULT) { SQLObjects.Defaults _defaults = new SQLObjects.Defaults(DBName); _defaults.GetObject<SQLObjects.Defaults>(_connections[0].sqlConnection); _ds.Merge(_defaults); } Sleep(); if ((objectsToSerialize & Convert.ToByte(_NodeType.RULE)) == (int)_NodeType.RULE) { SQLObjects.Rules _rules = new SQLObjects.Rules(DBName); _rules.GetObject<SQLObjects.Rules>(_connections[0].sqlConnection); _ds.Merge(_rules); } Sleep(); if ((objectsToSerialize & Convert.ToByte(_NodeType.UDDT)) == (int)_NodeType.UDDT) { SQLObjects.UDDTs _uddts = new SQLObjects.UDDTs(DBName); _uddts.GetObject<SQLObjects.UDDTs>(_connections[0].sqlConnection); _ds.Merge(_uddts); } Sleep(); if ((objectsToSerialize & Convert.ToByte(_NodeType.TABLE)) == (int)_NodeType.TABLE) { SQLObjects.Tables _tables = new SQLObjects.Tables(DBName); if (!string.IsNullOrEmpty(delimTableNames)) { _tables.GetObject<SQLObjects.Tables>(_connections[0].sqlConnection, Primary, delimTableNames); } else { _tables.GetObject<SQLObjects.Tables>(_connections[0].sqlConnection, Primary); } // TODO: make work with DBs attached as MDF files to SQL 2005 _ds.Merge(_tables); } Sleep(); if ((objectsToSerialize & Convert.ToByte(_NodeType.VIEW)) == (int)_NodeType.VIEW) { SQLObjects.Views _views = new SQLObjects.Views(DBName); _views.GetObject<SQLObjects.Views>(_connections[0].sqlConnection); _ds.Merge(_views); } Sleep(); if ((objectsToSerialize & Convert.ToByte(_NodeType.SPROC)) == (int)_NodeType.SPROC) { SQLObjects.Sprocs _sprocs = new SQLObjects.Sprocs(DBName); _sprocs.GetObject<SQLObjects.Sprocs>(_connections[0].sqlConnection); _ds.Merge(_sprocs); } Sleep(); if ((objectsToSerialize & Convert.ToByte(_NodeType.FUNCTION)) == (int)_NodeType.FUNCTION) { SQLObjects.Funcs _funcs = new SQLObjects.Funcs(DBName); _funcs.GetObject<SQLObjects.Funcs>(_connections[0].sqlConnection); _ds.Merge(_funcs); } Sleep(); if ((objectsToSerialize & Convert.ToByte(_NodeType.TRIGGER)) == (int)_NodeType.TRIGGER) { SQLObjects.Triggers _triggers = new SQLObjects.Triggers(DBName); _triggers.GetObject<SQLObjects.Triggers>(_connections[0].sqlConnection); _ds.Merge(_triggers); } // TODO: add jobs, users, roles Sleep(); // get rid of old files if (File.Exists(outputFile)) File.Delete(outputFile); // write out xml schema document XmlDataDocument xmlData = new XmlDataDocument(_ds); //xmlData.Save(outputFile); // reload to xml schema to avoid the "deleted row" error when removing the dependant child nodes XmlDocument xmlDoc = new XmlDocument(); //xmlDoc.Load(outputFile); xmlDoc.LoadXml(xmlData.OuterXml); Sleep(); // sort the dependencies for views, functions, and stored procedures SortDependencies(_serverDB, VIEWPATH, VIEWDEP, ref xmlDoc); SortDependencies(_serverDB, FUNCPATH, FUNCDEP, ref xmlDoc); SortDependencies(_serverDB, SPROCPATH, SPROCDEP, ref xmlDoc); foreach (Char c in Path.GetInvalidFileNameChars()) { outputFile = outputFile.Replace(c, '_'); } foreach (Char c in Path.GetInvalidPathChars()) { outputFile = outputFile.Replace(c, '_'); } xmlDoc.Save(outputFile); // perform garbage collection to free up memory GC.Collect(); if (Translate && outputFile != null && outputFile.Trim().Length > 0) { string createName = outputFile.ToLower().Replace(".xml", ".sql"); if (SQLfile != null && SQLfile.Length > 0) { createName = SQLfile.ToLower().Replace(".xml", ".sql"); } if (!createName.EndsWith(".sql")) { createName += ".sql"; } XsltHelper.SQLTransform(outputFile, XsltHelper.SQLCREATEXSLT, createName); outputFile += "," + createName; logger.Info("\nSQL Create Schema has been saved to " + createName + "."); } if (CustomXSLT != null && CustomXSLT.Trim().Length > 0) { FileInfo fi = new FileInfo(CustomXSLT); File.WriteAllText("CustomOutput.XML", XsltHelper.Transform(xmlDoc.OuterXml, fi)); logger.Info("\nThe Custom XSLT {0}, has been applied and saved as CustomOutput.XML.", CustomXSLT); } } } catch (Exception ex) { if (ex is System.Data.SqlClient.SqlException) { logger.Error("\nSQL Error: {0}, DB Server {1}", ex.Message, _serverDB); } else { logger.Error(ERRORFORMAT, ex.Message, ex.Source, ex.StackTrace); } } return outputFile; }
public SQLSecuritySettings(SQLServerExplorer sse) { string[] SQLServers = sse.Servers; SQLConnections sqlConnections = sse.SQLConnections; // // Required for Windows Form Designer support // InitializeComponent(); this.Height = 188; lblWarning.Visible = true; rdb_Integrated.Visible = false; rdb_Mixed.Visible = false; groupBox1.Visible = false; label2.Visible = false; label3.Visible = false; txt_PWD.Visible = false; txt_UID.Visible = false; label4.Top = 30; comboBox1.Top = 32; comboBox1.Enabled = false; btn_OK.Top = 88; btn_Cancel.Top = 119; lblWarning.Top = 88; _SQLConnections = sqlConnections; chkSavePwd.Visible = false; rdb_Integrated.Checked = true; rdb_Mixed.Checked = false; txt_ServerName.SelectedIndexChanged += new EventHandler(txt_ServerName_SelectedIndexChanged); txt_ServerName.Enabled = true; if (SQLServers != null) { txt_ServerName.Items.AddRange(SQLServers); } else { txt_ServerName.Enabled = true; txt_ServerName.Focus(); } string servername = string.Empty; if (typeof(ServerTreeNode).IsInstanceOfType(sse.SelectedTreeNode)) { servername = sse.SelectedTreeNode.Text; } if (typeof(DBTreeNode).IsInstanceOfType(sse.SelectedTreeNode)) { servername = sse.SelectedTreeNode.Parent.Text; } txt_ServerName.Text = servername; }