diff Database.cs @ 0:3ab940a0c7a0

Initial commit
author Ivo Smits <Ivo@UCIS.nl>
date Tue, 11 Sep 2012 16:28:53 +0200
parents
children 4b78cc5f116b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Database.cs	Tue Sep 11 16:28:53 2012 +0200
@@ -0,0 +1,127 @@
+using System;
+using System.Reflection;
+using System.Data;
+using System.Data.Common;
+using System.Collections.Generic;
+
+namespace UCIS {
+	public class Database {
+		private delegate object ConstructorDelegate();
+		private ConstructorInfo _ConnectionConstructor;
+
+		public Database(Type DBConnectionType, string connectionString) {
+			this.ConnectionString = connectionString;
+			_ConnectionConstructor = DBConnectionType.GetConstructor(new Type[] { });
+		}
+
+		public string ConnectionString { get; set; }
+
+		public virtual IDbConnection GetConnection() {
+			lock (_ConnectionConstructor) {
+				IDbConnection conn = (IDbConnection)_ConnectionConstructor.Invoke(null);
+				conn.ConnectionString = ConnectionString;
+				conn.Open();
+				return conn;
+			}
+		}
+
+		public IDbCommand PrepareQuery(string Query, params object[] Parameters) {
+			int ParameterI = 0;
+			IDbConnection Connection = GetConnection();
+			try {
+				IDbCommand Command = Connection.CreateCommand();
+				Command.CommandType = CommandType.Text;
+				Command.CommandText = Query;
+				Command.Parameters.Clear();
+				foreach (object Parameter in Parameters) {
+					IDbDataParameter DBParameter = Command.CreateParameter();
+					DBParameter.Direction = ParameterDirection.Input;
+					DBParameter.ParameterName = "?" + ParameterI.ToString();
+					DBParameter.Value = Parameter;
+					Command.Parameters.Add(DBParameter);
+					ParameterI++;
+				}
+				if (ParameterI > 0) Command.Prepare();
+				return Command;
+			} catch (Exception ex) {
+				Connection.Close();
+				throw ex;
+			}
+		}
+
+		public int NonQuery(string QueryString, params object[] Parameters) {
+			IDbCommand Command = PrepareQuery(QueryString, Parameters);
+			try {
+				return Command.ExecuteNonQuery();
+			} finally {
+				Command.Connection.Close();
+			}
+		}
+
+		public object FetchField(string QueryString, params object[] Parameters) {
+			IDbCommand Command = PrepareQuery(QueryString, Parameters);
+			try {
+				return Command.ExecuteScalar();
+			} finally {
+				Command.Connection.Close();
+			}
+		}
+		public object[] FetchRow(string QueryString, params object[] Parameters) {
+			IDbCommand Command = PrepareQuery(QueryString, Parameters);
+			try {
+				IDataReader Reader = Command.ExecuteReader();
+				try {
+					if (!Reader.Read()) return null;
+					object[] Result = new object[Reader.FieldCount];
+					Reader.GetValues(Result);
+					return Result;
+				} finally {
+					Reader.Close();
+				}
+			} finally {
+				Command.Connection.Close();
+			}
+		}
+		public object[][] FetchRows(string QueryString, params object[] Parameters) {
+			IDbCommand Command = PrepareQuery(QueryString, Parameters);
+			try {
+				IDataReader Reader = Command.ExecuteReader();
+				try {
+					List<object[]> Result = new List<object[]>();
+					while (Reader.Read()) {
+						object[] ResultArray = new object[Reader.FieldCount];
+						Reader.GetValues(ResultArray);
+						Result.Add(ResultArray);
+					}
+					return Result.ToArray();
+				} finally {
+					Reader.Close();
+				}
+			} finally {
+				Command.Connection.Close();
+			}
+		}
+		public void ForEachRow(Action<Object[]> f, string QueryString, params object[] Parameters) {
+			IDbCommand Command = PrepareQuery(QueryString, Parameters);
+			try {
+				IDataReader Reader = Command.ExecuteReader();
+				try {
+					while (Reader.Read()) {
+						object[] ResultArray = new object[Reader.FieldCount];
+						Reader.GetValues(ResultArray);
+						f(ResultArray);
+					}
+				} finally {
+					Reader.Close();
+				}
+			} finally {
+				Command.Connection.Close();
+			}
+
+		}
+
+		/*public DBReader GetReader(string QueryString, params object[] Parameters) {
+			return new DBReader(PrepareQuery(QueryString, Parameters));
+		}*/
+	}
+}
\ No newline at end of file