Beispiel #1
0
        public static void Process()
        {
            TargetProcessor   tp           = new TargetProcessor();
            AsyncUpdateStatus updateStatus = new AsyncUpdateStatus(TargetAsyncUpdateStatusHandler);
            string            sqlToExecute = CommonFunc.GetTextFromFile(_FileToProcess);

            _OutputResultsDirectory = _OutputResultsFile.Substring(0, _OutputResultsFile.LastIndexOf('\\') + 1);

            TargetServerInfo tsi = new TargetServerInfo();

            tsi.ServerInstance = _TargetServerName;
            tsi.TargetDatabase = _TargetDatabase;

            if (_bTargetConnectNTAuth == true)
            {
                // Use Windows authentication
                tsi.LoginSecure = true;
            }
            else
            {
                // Use SQL Server authentication
                tsi.LoginSecure = false;
                tsi.Login       = _TargetUserName;
                tsi.Password    = _TargetPassword;
            }

            tsi.Version = "";
            try
            {
                Retry.ExecuteRetryAction(() =>
                {
                    using (SqlConnection con = new SqlConnection(tsi.ConnectionStringRootDatabase))
                    {
                        ScalarResults sr = SqlHelper.ExecuteScalar(con, CommandType.Text, "SELECT @@VERSION");
                        string version   = (string)sr.ExecuteScalarReturnValue;
                        if (version.IndexOf("Azure") > 0)
                        {
                            tsi.ServerType = ServerTypes.AzureSQLDB;
                        }
                        else
                        {
                            tsi.ServerType = ServerTypes.SQLServer;
                        }
                        Match result = Regex.Match(version, @"[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+");
                        if (result.Success)
                        {
                            tsi.Version = result.Value;
                        }
                        else
                        {
                            Console.WriteLine(CommonFunc.FormatString(Properties.Resources.ErrorGettingSQLVersion, version));
                            return;
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return;
            }

            int dbMajor = Convert.ToInt32(tsi.Version.Substring(0, 2));

            //ok, we don't want to break the old version where they just passed in an int value without the "MB" or "GB".  So, we
            //can guess based on the edition what it should be.

            //web = 100 MB, 1 GB, 5 GB
            //business = 10 GB, 20 GB, 30 GB, 40 GB, 50 GB, 100 GB, or 150 GB
            //basic = 100 MB, 500 MB, 1 GB, 2 GB
            //standard = 100 MB, 500 MB, 1 GB, 2 GB, 5 GB, 10 GB, 20 GB, 30 GB, 40 GB, 50 GB, 100 GB, 150 GB, 200 GB, or 250 GB
            //premium = 100 MB, 500 MB, 1 GB, 2 GB, 5 GB, 10 GB, 20 GB, 30 GB, 40 GB, 50 GB, 100 GB, 150 GB, 200 GB, 250 GB, 300 GB, 400 GB, or 500 GB

            if (tsi.ServerType == ServerTypes.AzureSQLDB)
            {
                if (_TargetEdition == "web")
                {
                    if (dbMajor > 11)
                    {
                        Console.WriteLine(CommonFunc.FormatString(Properties.Resources.InvalidDatabaseEdition1V12, _TargetEdition));
                        return;
                    }

                    if (_TargetDatabaseSize[_TargetDatabaseSize.Length - 1] != 'B')
                    {
                        if (_TargetDatabaseSize == "1")
                        {
                            _TargetDatabaseSize = "1 GB";
                        }
                        else if (_TargetDatabaseSize == "5")
                        {
                            _TargetDatabaseSize = "5 GB";
                        }
                        else
                        {
                            _TargetDatabaseSize = "100 MB";
                        }
                    }
                }
                else if (_TargetEdition == "business")
                {
                    if (dbMajor > 11)
                    {
                        Console.WriteLine(CommonFunc.FormatString(Properties.Resources.InvalidDatabaseEdition1V12, _TargetEdition));
                        return;
                    }

                    if (_TargetDatabaseSize[_TargetDatabaseSize.Length - 1] != 'B')
                    {
                        _TargetDatabaseSize = _TargetDatabaseSize + " GB";
                    }
                }
                else if (_TargetEdition == "standard")
                {
                    if (dbMajor > 11)
                    {
                        if (!Regex.IsMatch(_TargetDatabasePerforance, "S[0-3]"))
                        {
                            Console.WriteLine(CommonFunc.FormatString(Properties.Resources.InvalidPerformanceLevelV12, _TargetDatabasePerforance, _TargetEdition));
                            return;
                        }
                    }
                    else
                    {
                        if (!Regex.IsMatch(_TargetDatabasePerforance, "S[0-2]"))
                        {
                            Console.WriteLine(CommonFunc.FormatString(Properties.Resources.InvalidPerformanceLevel, _TargetDatabasePerforance, _TargetEdition));
                            return;
                        }
                    }
                }
                else if (_TargetEdition == "premium")
                {
                    if (!Regex.IsMatch(_TargetDatabasePerforance, "P[1-3]"))
                    {
                        Console.WriteLine(CommonFunc.FormatString(Properties.Resources.InvalidPerformanceLevel, _TargetDatabasePerforance, _TargetEdition));
                        return;
                    }
                }
            }

            if (dbMajor == 12)
            {
                // Note with dbMajor 12 and above, disk size no longer matters
                _TargetDatabaseSize = "";
            }
            else
            {
                if (!ValidateDatabaseSize(_TargetEdition, _TargetDatabaseSize))
                {
                    Console.WriteLine(CommonFunc.FormatString(Properties.Resources.InvalidDatabaseSize, _TargetEdition, _TargetDatabaseSize));
                    return;
                }
            }

            //AsyncProcessingStatus.FinishedProcessingJobs = true;
            AsyncQueueBCPJob     queueBCPJob = new AsyncQueueBCPJob(AsyncQueueJobHandler);
            DatabaseCreateStatus dcs         = tp.CreateDatabase(tsi, _Collation, _TargetEdition, _TargetDatabaseSize, _TargetDatabasePerforance, _bDropExistingDatabase);

            if (dcs == DatabaseCreateStatus.Waiting)
            {
                Console.Write(Properties.Resources.WaitingForDBCreation);
                while (!tp.DoesDatabaseExist(tsi))
                {
                    Thread.Sleep(2000);
                    Console.Write(".");
                }
                Thread.Sleep(2000);
                Console.Write(Properties.Resources.DBCreated + Environment.NewLine);
            }
            else if (dcs == DatabaseCreateStatus.Failed)
            {
                Console.WriteLine(Properties.Resources.DBCreateFailed);
                return;
            }

            tp.ExecuteSQLonTarget(tsi, updateStatus, queueBCPJob, sqlToExecute);
        }
        private void btnCreateDatabase_Click(object sender, EventArgs e)
        {
            if (tbNewDatabase.Text.Length == 0)
            {
                MessageBox.Show(label1.Text, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                tbNewDatabase.Focus();
                return;
            }

            try
            {
                this.Cursor = Cursors.WaitCursor;
                TargetProcessor tp = new TargetProcessor();
                _TargetServerInfo.TargetDatabase = tbNewDatabase.Text;
                if (tp.DoesDatabaseExist(_TargetServerInfo))
                {
                    this.Cursor = Cursors.Default;
                    MessageBox.Show(Properties.Resources.MessageDatabaseExists, Properties.Resources.DatabaseExists, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    tbNewDatabase.Focus();
                }
                else
                {
                    string size             = "";
                    string edition          = "";
                    string performanceLevel = "";

                    if (_TargetServerInfo.ServerType == ServerTypes.AzureSQLDB)
                    {
                        edition          = ((DatabaseEdition)cbEdition.SelectedItem).Edition.Value;
                        performanceLevel = ((KeyValuePair <string, string>)cbPerformanceLevel.SelectedItem).Value;

                        if (_major < 12)
                        {
                            size = lbMaxDatabaseSize.Text;
                        }
                    }
                    DatabaseCreateStatus dcs = tp.CreateDatabase(_TargetServerInfo, ((Collation)cbCollations.SelectedValue).Name, edition, size, performanceLevel, false);

                    if (dcs == DatabaseCreateStatus.Success)
                    {
                        DatabaseName = "[" + tbNewDatabase.Text + "]";
                        DialogResult = DialogResult.OK;
                    }
                    else
                    {
                        // Ok, the database is in the process of being created, but the calling function
                        // will have to check back later to see if it has been created.  From what I have
                        // heard, it can take Azure SQL DB up to 30 minutes to deploy.

                        DialogResult = DialogResult.Retry;
                    }
                    Close();
                    this.Cursor = Cursors.Default;
                }
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;
                MessageBox.Show(CommonFunc.GetLowestException(ex), Properties.Resources.ErrorCreatingDB, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }