00001 using System; 00002 using System.Collections.Generic; 00003 using System.Linq; 00004 using System.Text; 00005 using System.Data; 00006 using System.Data.Common; 00007 00008 namespace Foodolini.Tools 00009 { 00010 public abstract class Database<TConnection> where TConnection : DbConnection, new() 00011 { 00012 public delegate T RelationalMapperDelegate<T>(IDataReader rdr); 00013 protected delegate T QueryHandler<T>(DbCommand cmd); 00014 00018 protected TConnection connection; 00019 00025 public bool ExecuteNonQuery(string sql) 00026 { 00027 return OpenDatabase<bool>(GetCommand(sql), 00028 delegate(DbCommand cmd) 00029 { 00030 return cmd.ExecuteNonQuery() > 0; 00031 }); 00032 } 00033 00034 protected abstract DbCommand GetCommand(string sql); 00035 00043 T OpenDatabase<T>(DbCommand cmd, QueryHandler<T> doQuery) 00044 { 00045 return OpenDatabase<T>(cmd, doQuery, true); 00046 } 00047 00048 public abstract TConnection GetConnection(); 00049 00050 T OpenDatabase<T>(DbCommand cmd, QueryHandler<T> doQuery, bool closeConnection) 00051 { 00052 T result = default(T); 00053 if (connection.State == ConnectionState.Closed) 00054 connection.Open(); 00055 result = doQuery(cmd); 00056 if (closeConnection) 00057 connection.Close(); 00058 return result; 00059 } 00060 00068 public T ExecuteReader<T>(string sql, RelationalMapperDelegate<T> map) where T : new() 00069 { 00070 return OpenDatabase<T>(GetCommand(sql), delegate(DbCommand cmd) 00071 { 00072 using (IDataReader rdr = cmd.ExecuteReader()) 00073 return map(rdr); 00074 }); 00075 } 00076 00077 public void CloseDatabase() 00078 { 00079 connection.Close(); 00080 } 00081 00087 public IDataReader GetReader(string sql) 00088 { 00089 return GetReader(sql, true); 00090 } 00091 00097 public IDataReader GetReader(string sql, bool closeConnection) 00098 { 00099 return OpenDatabase<IDataReader>(GetCommand(sql), delegate(DbCommand cmd) 00100 { 00101 return cmd.ExecuteReader(); 00102 }, closeConnection); 00103 } 00104 00110 public object ExecuteScalar(string sql) 00111 { 00112 return OpenDatabase<object>(GetCommand(sql), 00113 delegate(DbCommand cmd) 00114 { 00115 return cmd.ExecuteScalar(); 00116 }); 00117 } 00118 } 00119 }