using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using VEPROMS.CSLA.Library; using DevComponents.DotNetBar; using Volian.Base.Library; namespace VEPROMS { public partial class frmRODbProperties : Form { private ProgressBarItem _ProgressBar = null; public ProgressBarItem ProgressBar { get { return _ProgressBar; } set { _ProgressBar = value; } } private void DoProgressBarRefresh(int value, int max, string text) { if (ProgressBar == null) return; ProgressBar.Value = value; ProgressBar.Maximum = max; ProgressBar.Text = text; Application.DoEvents(); } private string InitialProgressBarMessage { set { if (ProgressBar == null) return; ProgressBar.Value = 100; ProgressBar.Maximum = 100; ProgressBar.Text = value; Application.DoEvents(); } } private string FinalProgressBarMessage { set { if (ProgressBar == null) return; ProgressBar.Value = 100; ProgressBar.Maximum = 100; ProgressBar.Text = value; Application.DoEvents(); } } private Point _ParentLocation; public Point ParentLocation { get { return _ParentLocation; } set { _ParentLocation = value; } } private RODbInfo _roDbInfo; private string _origROName; private string _origFolderPath; private string _origSQLConnect = null; private DocVersion _docVersion; public frmRODbProperties(DocVersion docVersion, RODbInfo roDbInfo) { _roDbInfo = roDbInfo; _docVersion = docVersion; InitializeComponent(); _origROName = (_roDbInfo == null) ? null : _roDbInfo.ROName; _origFolderPath = (_roDbInfo == null) ? null : _roDbInfo.FolderPath; _origSQLConnect = (_roDbInfo == null) ? null : (_roDbInfo.DBConnectionString == null || _roDbInfo.DBConnectionString == "" || _roDbInfo.DBConnectionString == "cstring") ? null : _roDbInfo.DBConnectionString; // Disable the OK button when initialized. Enable it if the user makes changes ppBtnTestSQL.Visible = ppBtnTestSQL.Enabled = CanMigrateRoAccessToSql(roDbInfo); ppTxtSQL.Visible = ppTxtSQL.Enabled = CanMigrateRoAccessToSql(roDbInfo); ppLblSQL.Visible = CanMigrateRoAccessToSql(roDbInfo); ppBtnOk.Enabled = false; } private bool CanMigrateRoAccessToSql(RODbInfo rODbi) { // C2017-003: This method is used to determine whether the sql server version can be used & if there is data. // A command line argument 'RoInSql'. For now, this argument must be used to allow code to run for ro->sql. Later // this will be changed so that if argument is used, the program does NOT include test button & text box to allow // entry of sql server connection string if (!Volian.Base.Library.VlnSettings.GetCommandFlag("RoInSql")) return false; // The following conditions must be true in order to migrate the set the connection string. // 1) the user must be an admin UserInfo ui = UserInfo.GetByUserID(VlnSettings.UserID); if (!ui.IsAdministrator()) return false; return true; } private void ppBtnFldrDlg_Click(object sender, EventArgs e) { FolderBrowserDialog dlgROFolder = new FolderBrowserDialog(); // Initialize the starting location in the Browser window dlgROFolder.SelectedPath = ppTxtPath.Text; if (dlgROFolder.ShowDialog() == DialogResult.OK) { ppTxtPath.Text = dlgROFolder.SelectedPath; } } private void ppBtnOk_Click(object sender, EventArgs e) { // check for modify. If the path to this rodb already exists, we've got to use that // as the assocation. if it's a new path, i.e. a modify of the rodb record, just save current data. // Then close & return. if ((_origROName !=null && _origFolderPath !=null && (_origROName != ppRTxtName.Text || _origFolderPath != ppTxtPath.Text)) || (_origSQLConnect != null && _origSQLConnect != ppTxtSQL.Text)) // B2020-011 fix check for change in sql connection string { if (!Directory.Exists(ppTxtPath.Text)) { MessageBox.Show(ppTxtPath.Text, "Invalid Directory for RO Database"); return; } if (!File.Exists(ppTxtPath.Text + @"\ro.fst")) { MessageBox.Show(ppTxtPath.Text, "Ro.Fst Doesn't Exist"); return; } RODb roDb = RODb.GetJustRoDb(_roDbInfo.RODbID); if (_origROName != ppRTxtName.Text) roDb.ROName = ppRTxtName.Text; if (_origSQLConnect == null && (ppTxtSQL.Text == null || ppTxtSQL.Text == "")) // B2020-011 fix check when connecting to an access database roDb.DBConnectionString = "cstring"; else if (!(_origSQLConnect == "cstring" && (ppTxtSQL.Text == null || ppTxtSQL.Text == "")) && _origSQLConnect != ppTxtSQL.Text) { // C2017-003: ro in sql. 'cstring' in connection string represents using MS Access database // if connect string is null, set connect string to "cstring" otherwise, use what user typed in: // first check if connection can be made to what was entered: bool canconnect = false; try { using (SqlConnection connection = new SqlConnection(ppTxtSQL.Text)) { try { connection.Open(); canconnect = (connection.State == ConnectionState.Open); } catch (SqlException) { } } } catch (Exception ex) {} if (canconnect) roDb.DBConnectionString = (ppTxtSQL.Text == null || ppTxtSQL.Text == "") ? "cstring" : ppTxtSQL.Text; else MessageBox.Show("SQL Connection failed, connection string won't be saved.", "Cannot save connection data"); } if (_origFolderPath != ppTxtPath.Text) { // see if an rodb already exists with this pathname. RODbInfoList roDbList = RODbInfoList.Get(); foreach (RODbInfo rdi in roDbList) { if (ppTxtPath.Text.ToUpper() == rdi.FolderPath.ToUpper()) { // if this has a previously defined path and a different name, do not save it. if(ppRTxtName.Text.ToUpper() != rdi.ROName.ToUpper()) { MessageBox.Show(string.Format("This path has been used for \"{0}\" Database",rdi.ROName), "Previously Used RO Path", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } // get the most recent rofst data for this rodb: ROFstInfoList roFstList = ROFstInfoList.GetByRODbID(rdi.RODbID); DateTime dts = new DateTime(1900, 1, 1); int rofstinfoid = -1; foreach (ROFstInfo rfi in roFstList) { if (rfi.DTS > dts) { dts = rfi.DTS; rofstinfoid = rfi.ROFstID; } } _docVersion.DocVersionAssociations[0].MyROFst = ROFst.Get(rofstinfoid); _docVersion.Save().Dispose(); DialogResult = DialogResult.OK; Close(); return; } } roDb.FolderPath = ppTxtPath.Text; } try { roDb.Save().Dispose(); DialogResult = DialogResult.OK; Close(); return; } catch (Exception ex) { MessageBox.Show(ex.Message); return; } } // this is creating a new rodb. A new rofst record will be created as well & the association set // check for unique name/path first RODbInfoList allrodbinfo = RODbInfoList.Get(); foreach (RODbInfo rdi in allrodbinfo) { if (ppRTxtName.Text == rdi.ROName) { MessageBox.Show("Create unique Description.", "Description is not unique"); return; } if (ppTxtPath.Text.ToUpper() == rdi.FolderPath.ToUpper()) { MessageBox.Show("Specify unique Folder Path or cancel and select an existing RO Database from drop-down.", "Folder Path is not unique" ); return; } } if (ppRTxtName.Text == null || ppRTxtName.Text == "") { MessageBox.Show("You must enter a Description."); return; } if (ppTxtPath.Text == null || ppTxtPath.Text == "") { MessageBox.Show("You must enter a Path."); return; } // check for an ro.fst existing in the selected path. If it is valid, create an rodb, rofst // and an association to its docversion. string rofstPath = ppTxtPath.Text + @"\ro.fst"; if (!File.Exists(rofstPath)) { MessageBox.Show("No existing ro.fst in path " + ppTxtPath.Text + ". Check for invalid path"); return; } string connectstr = ppTxtSQL.Text != null && ppTxtSQL.Text != "" ? ppTxtExt.Text : "cstring"; RODb newroDb = RODb.MakeRODb(ppRTxtName.Text, ppTxtPath.Text, connectstr, null); RODbInfo newrdi = RODbInfo.Get(newroDb.RODbID); newroDb.Save().Dispose(); ROFst rofst = ROFstInfo.AddRoFst(newrdi, _docVersion, DoProgressBarRefresh); DialogResult = DialogResult.OK; Close(); } private void frmRODbProperties_Load(object sender, EventArgs e) { Location = ParentLocation; ppRTxtName.Text = (_roDbInfo == null) ? null : _roDbInfo.ROName; ppTxtPath.Text = (_roDbInfo == null) ? null : _roDbInfo.FolderPath; ppTxtSQL.Text = (_roDbInfo == null) ? null : (_roDbInfo.DBConnectionString == "cstring") ? null : _roDbInfo.DBConnectionString; RODbConfig cfg = (_roDbInfo == null) ? new RODbConfig() : new RODbConfig(_roDbInfo); // Note that the Graphic Extension data is shown in a non-editable text box here because // the data is either retrieved from the roapp.ini - and if there can only be editted from // the file system. Otherwise it is derived from the top node - and changed from folder // properties on the top node. And lastly, it is the code default. ppTxtExt.Text = cfg.GetDefaultGraphicExtension(); ppLblGraphicFileExtLoc.Text = (cfg == null) ? null : cfg.GetDefaultGraphicExtensionLocation(); ppBtnOk.Enabled = false; if (_roDbInfo == null) { string newFolderPath = null; FolderBrowserDialog dlgROFolder = new FolderBrowserDialog(); dlgROFolder.RootFolder = Environment.SpecialFolder.MyComputer; dlgROFolder.SelectedPath = ppTxtPath.Text; if (dlgROFolder.ShowDialog() == DialogResult.OK) { newFolderPath = dlgROFolder.SelectedPath; RODbInfoList allRODBs = RODbInfoList.Get(); foreach(RODbInfo rodb in allRODBs) { if (newFolderPath.ToUpper() == rodb.FolderPath.ToUpper()) { ppRTxtName.Text = rodb.ROName; break; } } ppBtnOk.Enabled = true; } ppTxtPath.Text = newFolderPath; } // Initialize the enabled status for the OK button to false. //ppBtnOk.Enabled = false; ppTxtPath.TextChanged += ppTxtPath_TextChanged; } void ppTxtPath_TextChanged(object sender, EventArgs e) { //The OK button should only be enabled if the path has changed ppBtnOk.Enabled = _origFolderPath != ppTxtPath.Text; } private void ppTxtSQL_TextChanged(object sender, EventArgs e) { //The OK button should only be enabled if the path has changed ppBtnOk.Enabled = _origSQLConnect != ppTxtSQL.Text; } // C2017-003: test that the sql string entered can connect to the database: private void ppBtnTestSQL_Click(object sender, EventArgs e) { try { using (SqlConnection connection = new SqlConnection(ppTxtSQL.Text)) { try { connection.Open(); if (connection.State == ConnectionState.Open) { MessageBox.Show("You have been successfully connected to the database!"); } else { MessageBox.Show("Connection failed."); } } catch (SqlException) { } } } catch (Exception ex) { MessageBox.Show("Connection failed: " + ex); } } } }