private void okButton_Click(object sender, System.EventArgs args) { password = passwordBox.Text.Trim(); // Validate the password by attempting to log into to the server. // Note that login SQL Azure works a little differently from // standard SQL Server and it looks like normal accounts are // not able to login to the MASTER database. So we're not // going to validate credentials on SQL Azure. if (wizard.IsSqlAzure) { DialogResult = DialogResult.OK; return; } string conString; SqlContext ctx; WaitForm waitForm; wizard.Enabled = false; this.Update(); waitForm = new WaitForm("Verifying account credentials..."); waitForm.TopLevel = true; waitForm.Show(); waitForm.Update(); Thread.Sleep(2000); conString = string.Format("server={0};database=master;uid={1};pwd={2}", wizard.SetupState["server"], account, password); ctx = new SqlContext(conString); try { ctx.Open(); } catch (Exception e) { wizard.Enabled = true; waitForm.Close(); MessageBox.Show("Cannot validate the account. Check the password.\r\n\r\n" + e.Message, wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } finally { ctx.Close(); } wizard.Enabled = true; waitForm.Close(); // Success! DialogResult = DialogResult.OK; }
private void LoadAccounts() { // Load the listbox with the list of existing server logins, filtering // out the SA, Windows, or server role accounts as well as any built-in // accounts that begin with "##". SqlConnectionInfo conInfo; SqlContext ctx; SqlCommand cmd; DataSet ds; DataTable dt; WaitForm waitForm; string login; wizard.Enabled = false; this.Update(); waitForm = new WaitForm("Scanning accounts..."); waitForm.TopLevel = true; waitForm.Show(); waitForm.Update(); Thread.Sleep(2000); // Connect to the master database. conInfo = new SqlConnectionInfo(conString); conInfo.Database = "master"; ctx = new SqlContext(conInfo.ToString()); try { ctx.Open(); // Get the accounts (note that the sp_helplogins sproc does not exist on SQL Azure). if (ctx.IsSqlAzure) { cmd = ctx.CreateCommand("select name as 'LoginName' from sys.sql_logins"); } else { cmd = ctx.CreateSPCall("sp_helplogins"); } ds = ctx.ExecuteSet(cmd); dt = ds.Tables["0"]; accountList.Items.Clear(); foreach (DataRow row in dt.Rows) { login = SqlHelper.AsString(row["LoginName"]); // Append the account, skipping any that are empty or // appear to be a server role, a Windows domain account, // or a built-in account. if (login == null) { continue; // Empty } if (login.IndexOf('\\') != -1) { continue; // Windows account } if (String.Compare(login, "sa", true) == 0) { continue; // SA account } if (login.StartsWith("##")) { continue; // Built-in account } accountList.Items.Add(login); if (String.Compare(login, (string)wizard.SetupState["account"], true) == 0) { accountList.SelectedIndex = accountList.Items.Count - 1; } } } catch (Exception e) { wizard.Enabled = true; waitForm.Close(); MessageBox.Show("Cannot load database accounts.\r\n\r\n" + e.Message, wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } finally { ctx.Close(); } wizard.Enabled = true; waitForm.Close(); }
/// <summary> /// Called when the step is deactivated. /// </summary> /// <param name="steps">The step list.</param> /// <param name="forward"><c>true</c> if we're stepping forward in the wizard.</param> /// <returns><c>true</c> if the transition can proceed.</returns> public bool OnStepOut(WizardStepList steps, bool forward) { if (!forward) { return(true); } string database; database = (string)databaseList.SelectedItem; if (database == null) { MessageBox.Show("Select a database from the list or click Create\r\nto create a new one.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } else if (database.ToUpper() == "MASTER") { MessageBox.Show("Cannot install into the MASTER database.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } // Take a look at the database and ensure that it is either empty // or is already associated with this product ID and database type. SqlContext ctx; SqlCommand cmd; DataTable dt; WaitForm waitForm; string cs; wizard.Enabled = false; this.Update(); waitForm = new WaitForm(string.Format("Examining database [{0}]...", database)); waitForm.TopLevel = true; waitForm.Show(); waitForm.Update(); Thread.Sleep(2000); cs = string.Format("server={0};database={1};uid={2};pwd={3}", wizard.SetupState["server"], database, wizard.SetupState["adminAccount"], wizard.SetupState["adminPassword"]); ctx = new SqlContext(cs); try { ctx.Open(); // I'm going to determine whether the database is empty or // not by looking at the sysobjects table. We'll consider // it to be not empty if any these conditions are true: // // 1. Any user tables are present whose names // don't begin with "dt". // // 2. Any stored procedures or functions are present // whose names don't begin with "dt". cmd = ctx.CreateCommand("select 1 from sysobjects where (xtype='U' or xtype='P' or xtype='FN') and name not like 'dt%'"); dt = ctx.ExecuteTable(cmd); if (dt.Rows.Count == 0) { // The database appears to be empty. wizard.SetupState["Action"] = "Install"; } else { // The database appears to be not empty. Try calling the // GetProductInfo procedure. If this fails then assume that // the database belongs to some other application. If it // succeeds then check the productID and database type against // the setup settings. try { cmd = ctx.CreateSPCall("GetProductInfo"); dt = ctx.ExecuteTable(cmd); // Compare the database's product ID and database type to // the setup settings. if (SqlHelper.AsString(dt.Rows[0]["ProductID"]) != wizard.SetupState["productID"] || SqlHelper.AsString(dt.Rows[0]["DatabaseType"]) != wizard.SetupState["databaseType"]) { wizard.Enabled = true; waitForm.Close(); MessageBox.Show(string.Format("Database [{0}] is configured for use by [{1}:{2}].\r\n\r\nPlease select a different database.", database, SqlHelper.AsString(dt.Rows[0]["ProductName"]), SqlHelper.AsString(dt.Rows[0]["DatabaseType"])), wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } // The database looks like can accept the installation. wizard.SetupState["Action"] = "Upgrade"; wizard.SetupState["CurSchemaVersion"] = SqlHelper.AsString(dt.Rows[0]["SchemaVersion"]); } catch { wizard.Enabled = true; waitForm.Close(); MessageBox.Show(string.Format("Database [{0}] is not empty and appears to in use by another application.\r\n\r\nPlease select a different database.", database), wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } } } catch (Exception e) { wizard.Enabled = true; waitForm.Close(); MessageBox.Show("Setup could not connect to the database. Please check\r\nthe server name and account settings.\r\n\r\n" + e.Message, wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } finally { ctx.Close(); } wizard.Enabled = true; waitForm.Close(); // Success! wizard.SetupState["database"] = database; wizard.SetupState["connectionString"] = string.Format("server={0};database={1};uid={2};pwd={3}", wizard.SetupState["server"], wizard.SetupState["database"], wizard.SetupState["adminAccount"], wizard.SetupState["adminPassword"]); this.Hide(); return(true); }
private void LoadDatabases() { // Load the listbox with the list of databases on the server and // while we're at it we'll extract the master database's data // and log file folders. // // Note that we're not going to add the following system databases // to the list: // // master // model // msdb // tempdb // ReportServer // ReportServerTempDB Dictionary <string, bool> ignoreDBs = new Dictionary <string, bool>(StringComparer.OrdinalIgnoreCase); SqlContext ctx; SqlCommand cmd; DataSet ds; DataTable dt; WaitForm waitForm; string dbName; ignoreDBs.Add("master", true); ignoreDBs.Add("model", true); ignoreDBs.Add("msdb", true); ignoreDBs.Add("tempdb", true); ignoreDBs.Add("ReportServer", true); ignoreDBs.Add("ReportServerTempDB", true); wizard.Enabled = false; this.Update(); waitForm = new WaitForm("Scanning databases..."); waitForm.TopLevel = true; waitForm.Show(); waitForm.Update(); Thread.Sleep(2000); ctx = new SqlContext(conString); try { ctx.Open(); // Get the databases (note that the sp_databases sproc does not // exist on SQL Azure). if (wizard.IsSqlAzure) { cmd = ctx.CreateCommand("select name as DATABASE_NAME from sys.sysdatabases"); } else { cmd = ctx.CreateSPCall("sp_databases"); } dt = ctx.ExecuteTable(cmd); databaseList.Items.Clear(); foreach (DataRow row in dt.Rows) { dbName = SqlHelper.AsString(row["DATABASE_NAME"]); if (ignoreDBs.ContainsKey(dbName)) { continue; } databaseList.Items.Add(dbName); if (String.Compare(dbName, (string)wizard.SetupState["database"], true) == 0) { databaseList.SelectedIndex = databaseList.Items.Count - 1; } } if (!wizard.IsSqlAzure && (masterDataPath == null || masterLogPath == null)) { // Get the master database file paths cmd = ctx.CreateSPCall("sp_helpdb"); cmd.Parameters.Add("@dbname", SqlDbType.NVarChar).Value = "master"; ds = ctx.ExecuteSet(cmd); dt = ds.Tables["1"]; foreach (DataRow row in dt.Rows) { string file; int pos; if (SqlHelper.AsString(row["usage"]).ToLowerInvariant().IndexOf("data") != -1) { file = SqlHelper.AsString(row["filename"]); pos = file.LastIndexOf('\\'); if (pos != -1) { masterDataPath = file.Substring(0, pos + 1); } } else if (SqlHelper.AsString(row["usage"]).ToLowerInvariant().IndexOf("log") != -1) { file = SqlHelper.AsString(row["filename"]); pos = file.LastIndexOf('\\'); if (pos != -1) { masterLogPath = file.Substring(0, pos + 1); } } } // Set the paths to the empty string if all else fails if (masterDataPath == null) { masterDataPath = string.Empty; } if (masterLogPath == null) { masterLogPath = string.Empty; } } } catch (Exception e) { wizard.Enabled = true; waitForm.Close(); MessageBox.Show("Setup could not connect to the database. Please check\r\nthe server name and account settings.\r\n\r\n" + e.Message, wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } finally { ctx.Close(); } wizard.Enabled = true; waitForm.Close(); }
private void okButton_Click(object sender, System.EventArgs args) { account = accountBox.Text.Trim(); if (account.Length == 0) { MessageBox.Show("Please enter an account name.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); accountBox.Focus(); accountBox.SelectAll(); return; } password = passwordBox.Text.Trim(); if (password != confirmBox.Text.Trim()) { MessageBox.Show("The password and confirmation are not the same.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); passwordBox.Text = string.Empty; confirmBox.Text = string.Empty; passwordBox.Focus(); passwordBox.SelectAll(); return; } // Create the account SqlConnectionInfo conInfo; SqlContext ctx; SqlCommand cmd; WaitForm waitForm; wizard.Enabled = false; this.Update(); waitForm = new WaitForm("Creating account [" + account + "]..."); waitForm.TopLevel = true; waitForm.Show(); waitForm.Update(); Thread.Sleep(2000); conInfo = new SqlConnectionInfo((string)wizard.SetupState["connectionString"]); conInfo.Database = "master"; ctx = new SqlContext(conInfo.ToString()); try { ctx.Open(); if (ctx.IsSqlAzure) { cmd = ctx.CreateCommand("create login {0} with password='******'", account, password); } else { cmd = ctx.CreateSPCall("sp_addlogin"); cmd.Parameters.Add("@loginame", SqlDbType.VarChar).Value = account; cmd.Parameters.Add("@passwd", SqlDbType.VarChar).Value = password; } ctx.Execute(cmd); } catch (Exception e) { passwordBox.Text = string.Empty; confirmBox.Text = string.Empty; wizard.Enabled = true; waitForm.Close(); MessageBox.Show("Cannot create the new database account.\r\n\r\n" + e.Message, wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } finally { ctx.Close(); } wizard.Enabled = true; waitForm.Close(); // Success! DialogResult = DialogResult.OK; }
/// <summary> /// Called when the step is deactivated. /// </summary> /// <param name="steps">The step list.</param> /// <param name="forward"><c>true</c> if we're stepping forward in the wizard.</param> /// <returns><c>true</c> if the transition can proceed.</returns> public bool OnStepOut(WizardStepList steps, bool forward) { if (!forward) { return(true); } string server; string account; string password; // Validate the dialog entries. server = serverName.Text.Trim(); account = adminAccount.Text.Trim(); password = adminPassword.Text.Trim(); if (server == string.Empty) { MessageBox.Show("Please enter the database server name or IP address.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); serverName.Focus(); serverName.SelectAll(); return(false); } if (account == string.Empty) { MessageBox.Show("Please enter the database administrator account.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); adminAccount.Focus(); adminAccount.SelectAll(); return(false); } // Verify that the database server exists and that the account information // is valid by connecting to the database executing sp_helpsrvrolemember // and verifying that the account is returned as one of the accounts having // the sysadmin role. // // Note that sp_helpsrvrolemember does not exist on SQL Azure, so we're going // to first determine whether we're running on Azure and then skip this call // if we are. string conString; SqlContext ctx; SqlCommand cmd; DataTable dt; bool found; WaitForm waitForm; conString = string.Format("server={0};database={1};uid={2};pwd={3}", server, "master", account, password); wizard.Enabled = false; this.Update(); waitForm = new WaitForm("Verifying administrator credentials..."); waitForm.TopLevel = true; waitForm.Show(); waitForm.Update(); Thread.Sleep(2000); ctx = new SqlContext(conString); try { ctx.Open(); // SQL Azure detection wizard.IsSqlAzure = ctx.IsSqlAzure; // Verify that the account is an admin if (!wizard.IsSqlAzure) { cmd = ctx.CreateSPCall("sp_helpsrvrolemember"); cmd.Parameters.Add("@srvrolename", SqlDbType.NVarChar).Value = "sysadmin"; dt = ctx.ExecuteTable(cmd); found = false; foreach (DataRow row in dt.Rows) { if (String.Compare(account, SqlHelper.AsString(row["MemberName"]), true) == 0) { found = true; break; } } if (!found) { wizard.Enabled = true; waitForm.Close(); MessageBox.Show(string.Format("Account [{0}] is not a system administrator.", account.ToUpper()), wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); adminAccount.Focus(); adminAccount.SelectAll(); return(false); } } } catch (Exception e) { wizard.Enabled = true; waitForm.Close(); MessageBox.Show("Setup could not connect to the database. Please check\r\nthe server name and account settings.\r\n\r\n" + e.Message, wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } finally { ctx.Close(); } wizard.Enabled = true; waitForm.Close(); wizard.SetupState["connectionString"] = conString; wizard.SetupState["server"] = server; wizard.SetupState["adminAccount"] = account; wizard.SetupState["adminPassword"] = password; this.Hide(); return(true); }
private void okButton_Click(object sender, System.EventArgs args) { database = nameBox.Text.Trim(); // Validate the database name if (database.Length == 0) { MessageBox.Show("Please enter a name for the new database.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); nameBox.Focus(); nameBox.SelectAll(); return; } if (Char.IsDigit(database[0])) { MessageBox.Show("Database names cannot start with a number.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); nameBox.Focus(); nameBox.SelectAll(); return; } for (int i = 0; i < database.Length; i++) { if (!Char.IsLetterOrDigit(database[i]) && database[i] != '_') { MessageBox.Show("Invalid character in the database name.\r\n\r\nDatabase names may include only letters, numbers,\r\nor underscores.", wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); nameBox.Focus(); nameBox.SelectAll(); return; } } // Create the database SqlContext ctx; SqlCommand cmd; WaitForm waitForm; string query; string dataFile; string logFile; string maxSize; wizard.Enabled = false; this.Update(); waitForm = new WaitForm("Creating database [" + database + "]..."); waitForm.TopLevel = true; waitForm.Show(); waitForm.Update(); Thread.Sleep(2000); ctx = new SqlContext((string)wizard.SetupState["connectionString"]); try { ctx.Open(); if (ctx.IsSqlAzure) { maxSize = string.Format(" (maxsize={0}GB)", sizeComboBox.SelectedItem); } else { maxSize = string.Empty; } dataFile = dataFileBox.Text.Trim(); if (wizard.IsSqlAzure || dataFile.Length == 0 || dataFile == "[default]") { dataFile = null; } logFile = logFileBox.Text.Trim(); if (wizard.IsSqlAzure || logFile.Length == 0 || logFile == "[default]") { logFile = null; } if (dataFile != null && logFile != null) { query = string.Format("create database [{0}] on (name='{0}_data', filename='{1}') log on (name='{0}_log', filename='{2}')", database, dataFile, logFile); } else if (dataFile != null) { query = string.Format("create database [{0}] on (name='{0}_data', filename='{1}')", database, dataFile); } else { query = string.Format("create database [{0}]{1}", database, maxSize); } cmd = ctx.CreateCommand(query); ctx.Execute(cmd); } catch (Exception e) { wizard.Enabled = true; waitForm.Close(); MessageBox.Show("Cannot create the database.\r\n\r\n" + e.Message, wizard.SetupTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } finally { ctx.Close(); } wizard.Enabled = true; waitForm.Close(); // Success! DialogResult = DialogResult.OK; }