Click here to Skip to main content
15,891,951 members
Articles / Programming Languages / XML

Create Data Classes

Rate me:
Please Sign up or sign in to vote.
4.88/5 (31 votes)
4 Mar 2011CPOL10 min read 135.7K   2.5K   167  
An application that creates a C# class to read/write data to/from an Access, SQLite, or XML database.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace JGClassGenerator
{
	internal partial class FormDataTypes : FormBaseDialog
	{
		private bool m_DataIsDirty = false;
		private bool m_ShowingRecord = false;

		private JTypesData m_CurrentDataType = null;
		private JTypesData m_CheckDataType = null;

		private const string m_Caption = "Add / Edit / View Data Types";

		internal FormDataTypes()
		{
			InitializeComponent();
			ShowButtons = false;
		}

		private void FormDataTypes_Load(object sender, EventArgs e)
		{
			tsbtnNew.PerformClick();
			this.m_DataIsDirty = false;

			if (!String.IsNullOrEmpty(JCommon.ProgramDatabasePath))
				FillTreeView();
		}

		private void btnEditADOConversions_Click(object sender, EventArgs e)
		{
			FormConversions frmConversions = new FormConversions("Edit ADO Prefix/Suffix for " + txtDbTypeName.Text, this.m_CurrentDataType, false);
			frmConversions.ButtonOKText = "Save";
			if (frmConversions.ShowDialog(this) == DialogResult.OK)
			{
				ShowADOExample(this.m_CurrentDataType);
				SetDataStatus();
			}
		}

		private void btnEditSQLiteConversions_Click(object sender, EventArgs e)
		{
			FormConversions frmConversions = new FormConversions("Edit SQLite Prefix/Suffix for " + txtDbTypeName.Text, this.m_CurrentDataType, true);
			frmConversions.ButtonOKText = "Save";
			if (frmConversions.ShowDialog(this) == DialogResult.OK)
			{
				ShowSQLiteExample(this.m_CurrentDataType);
				SetDataStatus();
			}
		}

		private bool CheckBrackets(Label lblTemp)
		{
			string tempText = lblTemp.Text;

			int opening = JCommon.CountChars(tempText, '(');
			int closing = JCommon.CountChars(tempText, ')');

			if (opening != closing)
			{
				lblTemp.ForeColor = Color.Red;
				return false;
			}
			else
			{
				lblTemp.ForeColor = SystemColors.WindowText;
				return true;
			}
		}

		internal bool CheckSave()
		{
			if (this.m_CheckDataType == null)
				return true;

			bool dataIsDirty = IsDataDirty(this.m_CurrentDataType, this.m_CheckDataType);

			if (!dataIsDirty)
				return true;

			DialogResult dr = JCommon.GetDialogResult("Current Record Has Changed, Save Data?", "Record Changed", MessageBoxButtons.YesNoCancel);
			if (dr == DialogResult.Yes)
			{
				return SaveRecord() > 0;
			}
			else if (dr == DialogResult.No)
			{
				return true;
			}
			else
			{
				return false;
			}
		}

		private void ClearForm()
		{
			int nextTypeID = JTypesUpdater.GetNextTypeID();
			lblTypeID.Text = nextTypeID.ToString();

			tslblRecordNumber.Text = "0";
			tslblLastUpdated.Text = "";

			txtFormattedInitialValue.Text = "";
			txtDbTypeName.Text = "";
			txtNETType.Text = "";
			txtCSharpType.Text = "";
			txtAccessType.Text = "";
			txtSQLiteType.Text = "";
			txtSQLType.Text = "";

			txtNotes.Clear();

			chkIsNumeric.Checked = false;
		}

		private void Data_Changed(object sender, EventArgs e)
		{
			GetRecordFromForm(ref this.m_CheckDataType);
			SetDataStatus();
		}

		private bool IsDataDirty(JTypesData originalJTypesData, JTypesData compareJTypesData)
		{
			if (originalJTypesData.DbType != compareJTypesData.DbType)
				return true;
			if (originalJTypesData.TypeID != compareJTypesData.TypeID)
				return true;
			if (originalJTypesData.LengthRequired != compareJTypesData.LengthRequired)
				return true;
			if (originalJTypesData.NETType != compareJTypesData.NETType)
				return true;
			if (originalJTypesData.CSharpType != compareJTypesData.CSharpType)
				return true;
			if (originalJTypesData.AccessType != compareJTypesData.AccessType)
				return true;
			if (originalJTypesData.SQLiteType != compareJTypesData.SQLiteType)
				return true;
			if (originalJTypesData.SQLType != compareJTypesData.SQLType)
				return true;
			if (originalJTypesData.IsNumeric != compareJTypesData.IsNumeric)
				return true;
			if (originalJTypesData.ADOConversionPrefix != compareJTypesData.ADOConversionPrefix)
				return true;
			if (originalJTypesData.ADOConversionSuffix != compareJTypesData.ADOConversionSuffix)
				return true;
			if (originalJTypesData.SQLiteConversionPrefix != compareJTypesData.SQLiteConversionPrefix)
				return true;
			if (originalJTypesData.SQLiteConversionSuffix != compareJTypesData.SQLiteConversionSuffix)
				return true;
			if (originalJTypesData.SQLiteUpdateSuffix != compareJTypesData.SQLiteUpdateSuffix)
				return true;
			if (originalJTypesData.Notes != compareJTypesData.Notes)
				return true;
			if (originalJTypesData.FormattedInitialValue != compareJTypesData.FormattedInitialValue)
				return true;

			return false;
		}

		private void CopyRecord(JTypesData source, JTypesData dest)
		{
			dest.DbType = source.DbType;
			dest.TypeID = source.TypeID;
			dest.LengthRequired = source.LengthRequired;
			dest.NETType = source.NETType;
			dest.CSharpType = source.CSharpType;
			dest.AccessType = source.AccessType;
			dest.SQLiteType = source.SQLiteType;
			dest.SQLType = source.SQLType;
			dest.IsNumeric = source.IsNumeric;
			dest.ADOConversionPrefix = source.ADOConversionPrefix;
			dest.ADOConversionSuffix = source.ADOConversionSuffix;
			dest.SQLiteConversionPrefix = source.SQLiteConversionPrefix;
			dest.SQLiteConversionSuffix = source.SQLiteConversionSuffix;
			dest.SQLiteUpdateSuffix = source.SQLiteUpdateSuffix;
			dest.Notes = source.Notes;
			dest.FormattedInitialValue = source.FormattedInitialValue;
		}

		private bool DeleteRecord(int recordNumber)
		{
			JTypesData dataTypesData = new JTypesData(recordNumber);
			if ((MessageBox.Show("Confirm Deletion of " + dataTypesData.DbType + "?", "Delete Record", MessageBoxButtons.YesNo)) != DialogResult.Yes)
				return false;

			if (JTypesUpdater.DeleteRecord(dataTypesData))
			{
				ShowMessage("Record Deleted", false);
				return true;
			}
			else
			{
				ShowMessage("Unable To Delete Record", true);
				return false;
			}
		}

		

		private void FillTreeView()
		{
			tvDataTypes.Nodes.Clear();
			TreeNode tnNew;

			List<JTypesData> listTypes = JTypesUpdater.AllRecords("DbType");

			foreach (JTypesData current in listTypes)
			{
				tnNew = new TreeNode(current.DbType);
				tnNew.Tag = current.RecordNumber;

				tvDataTypes.Nodes.Add(tnNew);
			}
		}

		private void GetRecordFromForm(ref JTypesData dataType)
		{
			dataType.DbType = txtDbTypeName.Text;
			dataType.TypeID = TypeID;

			dataType.IsNumeric = chkIsNumeric.Checked;
			dataType.LengthRequired = chkLengthRequired.Checked;
			dataType.FormattedInitialValue = txtFormattedInitialValue.Text;

			dataType.NETType = txtNETType.Text;
			dataType.CSharpType = txtCSharpType.Text;
			dataType.AccessType = txtAccessType.Text;
			dataType.SQLiteType = txtSQLiteType.Text;
			dataType.SQLType = txtSQLType.Text;

			dataType.IsNumeric = chkIsNumeric.Checked;

			dataType.Notes = txtNotes.Text;
		}

		private int RecordNumber
		{
			get
			{
				try
				{
					return Convert.ToInt32(tslblRecordNumber.Text);
				}
				catch
				{
					return 0;
				}
			}
		}

		private int SaveRecord()
		{
			int newRecNum = 0;

			GetRecordFromForm(ref this.m_CurrentDataType);

			if (this.m_CurrentDataType.RecordNumber < 1)
			{
				newRecNum = JTypesUpdater.AddRecord(this.m_CurrentDataType);
				return newRecNum;
			}
			else
			{
				if (JTypesUpdater.UpdateRecord(this.m_CurrentDataType))
					return this.m_CurrentDataType.RecordNumber;
				else
					return 0;
			}
		}

		private void SetDataStatus()
		{
			if (m_ShowingRecord)
				return;

			bool dataIsDirty = IsDataDirty(this.m_CurrentDataType, this.m_CheckDataType);

			if (this.m_DataIsDirty != dataIsDirty)
			{
				this.m_DataIsDirty = dataIsDirty;
			}

			if (this.m_DataIsDirty)
			{
				this.Text = m_Caption + "*";
			}
			else
			{
				this.Text = m_Caption;
			}
		}

		private void ShowADOExample(JTypesData dataType)
		{
			lblADOGetSample.Text = "ClassName.FieldName = " + dataType.ADOConversionPrefix + "dataRow[\"FieldName\"]" + dataType.ADOConversionSuffix;
			
			if (!CheckBrackets(lblADOGetSample))
			{
				lblADOParenthesis.Text = "Parentheses Mis-match";
				lblADOParenthesis.ForeColor = Color.Red;
			}
			else
			{
				lblADOParenthesis.Text = "";
				lblADOParenthesis.ForeColor = SystemColors.WindowText;
			}
		}

		private void ShowRecord(int recordNumber)
		{
			JTypesData dataTypesData = new JTypesData(recordNumber);
			ShowRecord(dataTypesData);
		}

		private void ShowRecord(JTypesData dataType)
		{
			m_ShowingRecord = true;

			this.m_CurrentDataType = dataType;
			this.m_CheckDataType = new JTypesData();
			CopyRecord(this.m_CurrentDataType, this.m_CheckDataType);

			tslblRecordNumber.Text = dataType.RecordNumber.ToString();
			tslblLastUpdated.Text = dataType.LastUpdated.ToString();

			lblTypeID.Text = dataType.TypeID.ToString();
			txtDbTypeName.Text = dataType.DbType;
			chkIsNumeric.Checked = dataType.IsNumeric;
			chkLengthRequired.Checked = dataType.LengthRequired;
			txtFormattedInitialValue.Text = dataType.FormattedInitialValue;
			txtNETType.Text = dataType.NETType;
			txtCSharpType.Text = dataType.CSharpType;
			txtAccessType.Text = dataType.AccessType;
			txtSQLiteType.Text = dataType.SQLiteType;
			txtSQLType.Text = dataType.SQLType;

			chkIsNumeric.Checked = dataType.IsNumeric;

			txtNotes.Text = dataType.Notes;

			ShowADOExample(dataType);
			ShowSQLiteExample(dataType);

			m_ShowingRecord = false;
		}

		private void ShowSQLiteExample(JTypesData dataType)
		{			
			lblSQLiteGetExample.Text = "ClassName.FieldName = " + dataType.SQLiteConversionPrefix + "dataRow[\"FieldName\"]" + dataType.SQLiteConversionSuffix;
			
			if (!CheckBrackets(lblSQLiteGetExample))
			{
				lblSQLiteReadParenthesis.Text = "Parentheses Mis-match";
				lblSQLiteReadParenthesis.ForeColor = Color.Red;
			}
			else
			{
				lblSQLiteReadParenthesis.Text = "";
				lblSQLiteReadParenthesis.ForeColor = SystemColors.WindowText;
			}

			lblSQLiteInsertExample.Text = "commandInsert.Parameters.Add(new SQLiteParameter(\"@FieldName\", ClassName.FieldName" + dataType.SQLiteUpdateSuffix;
			if (!CheckBrackets(lblSQLiteInsertExample))
			{
				lblSQLiteInsertParenteses.Text = "Parentheses Mis-match";
				lblSQLiteInsertParenteses.ForeColor = Color.Red;
				lblSQLiteInsertExample.ForeColor = Color.Red;
				lblSQLiteUpdateExample.ForeColor = Color.Red;
			}
			else
			{
				lblSQLiteInsertParenteses.Text = "";
				lblSQLiteInsertParenteses.ForeColor = SystemColors.WindowText;
				lblSQLiteInsertExample.ForeColor = SystemColors.WindowText;
				lblSQLiteUpdateExample.ForeColor = SystemColors.WindowText;
			}
			lblSQLiteUpdateExample.Text = "commandUpdate.Parameters.Add(new SQLiteParameter(\"FieldName\", ClassName.FieldName" + dataType.SQLiteUpdateSuffix;
		}

		private void tsbtnClose_Click(object sender, EventArgs e)
		{
			if (CheckSave())
				Close();
		}

		private void tsbtnDelete_Click(object sender, EventArgs e)
		{
			if (DeleteRecord(RecordNumber))
			{
				ClearForm();
				FillTreeView();
			}
		}

		private void tsbtnFillListView_Click(object sender, EventArgs e)
		{
			FillTreeView();
		}

		private void tsbtnNew_Click(object sender, EventArgs e)
		{
			ClearForm();
		}

		private void tsbtnSave_Click(object sender, EventArgs e)
		{
			int recNum = SaveRecord();

			if (recNum > 0)
			{
				ShowMessage("Record Saved", false);
				FillTreeView();
				ClearForm();
			}
			else
			{
				ShowMessage("Unable To Save Record", true);
			}
		}

		private void tvDataTypes_AfterSelect(object sender, TreeViewEventArgs e)
		{
			this.m_DataIsDirty = false;
			this.Text = m_Caption;
			int recNum = Convert.ToInt32(e.Node.Tag);
			ShowRecord(recNum);
		}

		//	This is why it's a TreeView, not a ListView
		private void tvDataTypes_BeforeSelect(object sender, TreeViewCancelEventArgs e)
		{
			e.Cancel = !CheckSave();
		}


		private int TypeID
		{
			get
			{
				try
				{
					return Convert.ToInt32(lblTypeID.Text);
				}
				catch
				{
					return 0;
				}
			}
		}


		

		


		

	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Retired
United Kingdom United Kingdom
I have been a keen hobbyist programmer since getting my first computer - a Vic 20 (you had to be able to write programs then since few programs were available and all were expensive).
Retired and now living in Pewsey, Wiltshire, where I spend (far too much of) my time writing computer programs to keep my mind active.

Comments and Discussions