diff --git a/TrackMyQuery/CXPacketTrackingForm.cs b/TrackMyQuery/CXPacketTrackingForm.cs
index 2674e36..ae7bba4 100644
--- a/TrackMyQuery/CXPacketTrackingForm.cs
+++ b/TrackMyQuery/CXPacketTrackingForm.cs
@@ -1,15 +1,9 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Diagnostics;
-using System.Threading;
namespace TrackMyQuery
{
diff --git a/TrackMyQuery/DbConnector.cs b/TrackMyQuery/DbConnector.cs
new file mode 100644
index 0000000..0dd1a7a
--- /dev/null
+++ b/TrackMyQuery/DbConnector.cs
@@ -0,0 +1,245 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using System.Data.Odbc;
+using System.Data.OleDb;
+using System.Data.SqlClient;
+using System.Diagnostics;
+using System.IO;
+
+//@sqlchow: This class is a sum of all the research I was doing on creating a dbconnection factory.
+
+namespace TrackMyQuery
+{
+ class DbConnector : IDisposable
+ {
+ private string strConnectionString;
+ private DbConnection dbConnection;
+ private DbCommand dbCommand;
+ private DbProviderFactory dbFactory = null;
+ private bool boolHandleErrors;
+ private string strLastError;
+ private bool boolLogError;
+ private string strLogFile;
+
+ public DbConnector(string connectionstring, Providers provider)
+ {
+ strConnectionString = connectionstring;
+ switch (provider)
+ {
+ case Providers.SqlServer:
+ dbFactory = SqlClientFactory.Instance;
+ break;
+ case Providers.OleDb:
+ dbFactory = OleDbFactory.Instance;
+ break;
+ case Providers.ODBC:
+ dbFactory = OdbcFactory.Instance;
+ break;
+ }
+
+ dbConnection = dbFactory.CreateConnection();
+ dbCommand = dbFactory.CreateCommand();
+
+ dbConnection.ConnectionString = strConnectionString;
+ dbCommand.Connection = dbConnection;
+ }
+
+ public DbConnector(string strConnectionString)
+ : this(strConnectionString, Providers.SqlServer)
+ {
+ }
+
+ public bool HandleErrors
+ {
+ get { return boolHandleErrors; }
+ set { boolHandleErrors = value; }
+ }
+
+ public string LastError
+ {
+ get { return strLastError; }
+ }
+
+ public bool LogErrors
+ {
+ get { return boolLogError; }
+ set { boolLogError = value; }
+ }
+
+ public string LogFile
+ {
+ get { return strLogFile; }
+ set { strLogFile = value; }
+ }
+
+ public int AddParameter(string name, object value)
+ {
+ DbParameter dbParam = dbFactory.CreateParameter();
+ dbParam.ParameterName = name;
+ dbParam.Value = value;
+
+ return dbCommand.Parameters.Add(dbParam);
+ }
+
+ public int AddParameter(DbParameter dbParam)
+ {
+ return dbCommand.Parameters.Add(dbParam);
+ }
+
+ public DbCommand Command
+ {
+ get { return dbCommand; }
+ }
+
+ public DbDataReader ExecuteReader(string dbQuery, CommandType dbCommandType, ConnectionState dbConnectionState)
+ {
+ DbDataReader dbReader = null;
+
+ dbCommand.CommandText = dbQuery;
+ dbCommand.CommandType = dbCommandType;
+
+ try
+ {
+ if (dbConnection.State == System.Data.ConnectionState.Closed)
+ {
+ dbConnection.Open();
+ }
+
+ if (dbConnectionState == ConnectionState.CloseOnExit)
+ {
+ dbReader = dbCommand.ExecuteReader(CommandBehavior.CloseConnection);
+ }
+ else
+ {
+ dbReader = dbCommand.ExecuteReader();
+ }
+ }
+ catch (Exception ex)
+ {
+ HandleExceptions(ex);
+ }
+ finally
+ {
+ dbCommand.Parameters.Clear();
+ }
+
+ return dbReader;
+ }
+
+
+ public DataSet ExecuteDataSet(string dbQuery, CommandType dbCommandType, ConnectionState dbConnectionState)
+ {
+ DataSet dbDataSet = new DataSet();
+ DbDataAdapter dbAdapter = dbFactory.CreateDataAdapter();
+
+ dbCommand.CommandText = dbQuery;
+ dbCommand.CommandType = dbCommandType;
+ dbAdapter.SelectCommand = dbCommand;
+
+ try
+ {
+ dbAdapter.Fill(dbDataSet);
+ }
+ catch (Exception ex)
+ {
+ HandleExceptions(ex);
+ }
+ finally
+ {
+ dbCommand.Parameters.Clear();
+ if (dbConnectionState == ConnectionState.CloseOnExit)
+ {
+ if (dbConnection.State == System.Data.ConnectionState.Open)
+ {
+ dbConnection.Close();
+ }
+ }
+ }
+
+ return dbDataSet;
+ }
+
+ public object ExecuteScalar(string dbQuery, CommandType dbCommandType, ConnectionState dbConnectionState)
+ {
+ dbCommand.CommandText = dbQuery;
+ dbCommand.CommandType = dbCommandType;
+ object returnObj = null;
+ try
+ {
+ if (dbConnection.State == System.Data.ConnectionState.Closed)
+ {
+ dbConnection.Open();
+ }
+ returnObj = dbCommand.ExecuteScalar();
+ }
+ catch (Exception ex)
+ {
+ HandleExceptions(ex);
+ }
+ finally
+ {
+ dbCommand.Parameters.Clear();
+ if (dbConnectionState == ConnectionState.CloseOnExit)
+ {
+ dbConnection.Close();
+ }
+ }
+
+ return returnObj;
+ }
+
+ private void HandleExceptions(Exception ex)
+ {
+ StackFrame exStack = new StackTrace(ex, true).GetFrame(0);
+ string exceptionMethod = exStack.GetMethod().Name;
+ string exceptionLine = exStack.GetFileLineNumber().ToString();
+ string exSource = string.Format("Exception raised in {0} at line number: {1}", exceptionMethod, exceptionLine);
+
+ if (LogErrors)
+ {
+ WriteToLog(exceptionMethod, exceptionLine, ex.Message);
+ }
+
+ if (HandleErrors)
+ {
+ strLastError = exSource + "\n" + ex.Message;
+ }
+ else
+ {
+ throw ex;
+ }
+ }
+
+ private void WriteToLog(string methodName, string lineNumber, string message)
+ {
+ StreamWriter logWriter = File.AppendText(LogFile);
+ logWriter.WriteLine(DateTime.Now.ToString() + " - [" + methodName + ":" + lineNumber + "] - " + message);
+ logWriter.Close();
+ }
+
+ private void WriteToLog(string message)
+ {
+ StreamWriter logWriter = File.AppendText(LogFile);
+ logWriter.WriteLine(DateTime.Now.ToString() + " - " + message);
+ logWriter.Close();
+ }
+
+ public void Dispose()
+ {
+ dbCommand.Dispose();
+ dbConnection.Close();
+ dbConnection.Dispose();
+ }
+ }
+
+ public enum Providers
+ {
+ SqlServer, ODBC, OleDb
+ }
+
+ public enum ConnectionState
+ {
+ KeepOpen, CloseOnExit
+ }
+}
diff --git a/TrackMyQuery/MainMenuForm.cs b/TrackMyQuery/MainMenuForm.cs
index 2a64368..e9bef38 100644
--- a/TrackMyQuery/MainMenuForm.cs
+++ b/TrackMyQuery/MainMenuForm.cs
@@ -1,11 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
diff --git a/TrackMyQuery/QueryProfilesTrackingForm.cs b/TrackMyQuery/QueryProfilesTrackingForm.cs
index 7ddafac..269eb3e 100644
--- a/TrackMyQuery/QueryProfilesTrackingForm.cs
+++ b/TrackMyQuery/QueryProfilesTrackingForm.cs
@@ -1,15 +1,9 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Diagnostics;
-using System.Threading;
namespace TrackMyQuery
{
diff --git a/TrackMyQuery/TrackMyQuery.csproj b/TrackMyQuery/TrackMyQuery.csproj
index 3ddc7f0..93d9fca 100644
--- a/TrackMyQuery/TrackMyQuery.csproj
+++ b/TrackMyQuery/TrackMyQuery.csproj
@@ -65,6 +65,7 @@
CXPacketTrackingForm.cs
+
Form