summaryrefslogtreecommitdiff
path: root/src/app/Cmpp298.Assignment3.DataAccess/DatabaseGateway.cs
blob: 55b02213e5ffac76316af2ae1f91a77c6117d067 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using System.Data;

namespace Cmpp298.Assignment3.DataAccess {
	public class DatabaseGateway : IDatabaseGateway {
		private IDatabaseConnectionFactory _connectionFactory;

		public DatabaseGateway( ) : this( new DatabaseConnectionFactory( ) ) {}

		public DatabaseGateway( IDatabaseConnectionFactory connectionFactory ) {
			_connectionFactory = connectionFactory;
		}

		public int InsertRowUsing( InsertQueryBuilder builder ) {
			return ExecuteBuilderQuery( builder.Parameters, builder.ToString( ) );
		}

		public void UpdateRowUsing( UpdateQueryBuilder builder ) {
			ExecuteBuilderQuery( builder.Parameters, builder.ToString( ) );
		}

		public void Execute( string query ) {
			using ( IDbConnection connection = _connectionFactory.Create( ) ) {
				IDbCommand command = connection.CreateCommand( );
				connection.Open( );
				command.CommandText = query;
				command.ExecuteNonQuery( );
			}
		}

		public DataTable GetTableFrom( SelectQueryBuilder builder ) {
			return GetTableFrom( builder.ToString( ) );
		}

		private DataTable GetTableFrom( string sqlQuery ) {
			using ( IDbConnection connection = _connectionFactory.Create( ) ) {
				IDbCommand command = connection.CreateCommand( );
				command.CommandText = sqlQuery;
				connection.Open( );
				IDataReader reader = command.ExecuteReader( );
				DataTable table = new DataTable( );
				table.Load( reader );
				return table;
			}
		}

		private int ExecuteBuilderQuery( ICollection< CommandParameter > parameters, string commandText ) {
			object scalar;
			using ( IDbConnection connection = _connectionFactory.Create( ) ) {
				IDbCommand command = connection.CreateCommand( );

				foreach ( CommandParameter parameter in parameters ) {
					IDataParameter commandParameter = command.CreateParameter( );
					commandParameter.ParameterName = "@" + parameter.ColumnName;
					commandParameter.Value = parameter.Value;
					command.Parameters.Add( commandParameter );
				}

				command.CommandText = commandText;
				connection.Open( );
				scalar = command.ExecuteScalar( );
			}
			return DBNull.Value != scalar ? Convert.ToInt32( scalar ) : -1;
		}
	}
}