321 lines
11 KiB
C#
321 lines
11 KiB
C#
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);
|
|
}
|
|
|
|
}
|
|
}
|
|
} |