Programmeren in ASP.net 2.0 N-Tier Tutorial/Common Laag/Database.cs
Uiterlijk
C#-code: "Database.cs"
using System;
using System.Configuration;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;
namespace MessageBoard.Common
{
public sealed class Database
{
private DbProviderFactory _factory;
private string _connectionString;
private DbConnection _con;
private Database(ConnectionStringSettings settings)
{
_factory = DbProviderFactories.GetFactory(settings.ProviderName);
_connectionString = settings.ConnectionString;
}
private Database(string connectionString, DbProviderFactory factory)
{
_factory = factory;
_connectionString = connectionString;
}
public static Database GetInstance(string connectionStringName)
{
if (connectionStringName == null)
throw new ArgumentNullException("The name of the connectionstring cannot be null", "connectionStringName");
if (connectionStringName == string.Empty)
throw new ArgumentException("String cannot be an empty string", "connectionStringName");
ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[connectionStringName];
if (settings == null) throw new ArgumentException("Invalid or non-existing name for the connectionstring", "connectionStringName");
return new Database(settings);
}
public static Database GetInstance(string connectionString, string provider)
{
if(string.IsNullOrEmpty(connectionString))
throw new ArgumentException("Connection string cannot be null or empty.");
if(string.IsNullOrEmpty(provider))
throw new ArgumentException("The provider name cannot be null or empty.");
DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
if(factory == null)
throw new ArgumentException("Invalid provider name.");
return new Database(connectionString, factory);
}
public string ConnectionString
{
get
{
return _connectionString;
}
}
private DbConnection Connection
{
get
{
if (_con == null || _con.State == ConnectionState.Closed)
{
_con = _factory.CreateConnection();
}
if(_con.State != ConnectionState.Open)
_con.ConnectionString = ConnectionString;
return _con;
}
}
public DbTransaction BeginTransaction()
{
DbConnection con = _factory.CreateConnection();
con.ConnectionString = ConnectionString;
con.Open();
return con.BeginTransaction();
}
public DbCommand CreateSqlCommand(string sql, params DbParameter[] parameters)
{
if (sql == null)
throw new ArgumentNullException("SQL-statement cannot be null", "sql");
if (sql == string.Empty)
throw new ArgumentException("SQL-Statement cannot be an empty string", "sql");
DbCommand cmd = _factory.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
if (parameters.Length > 0)
cmd.Parameters.AddRange(parameters);
return cmd;
}
public DbCommand CreateSPCommand(string storedProc, params DbParameter[] parameters)
{
if (storedProc == null) throw new ArgumentNullException("Stored procedure name cannot be null", "storedProc");
if (storedProc == string.Empty) throw new ArgumentException("Stored procedure name cannot be an empty string", "storedProc");
DbCommand cmd = _factory.CreateCommand();
cmd.CommandText = storedProc;
cmd.CommandType = CommandType.StoredProcedure;
if (parameters.Length > 0)
cmd.Parameters.AddRange(parameters);
return cmd;
}
public DbParameter CreateParameter(string name, object value)
{
DbParameter par = _factory.CreateParameter();
par.ParameterName = name;
par.SourceColumnNullMapping = true;
par.Value = value == null ? DBNull.Value : value;
return par;
}
public DbParameter CreateParameter(string name, string srcColumn, object value)
{
DbParameter par = _factory.CreateParameter();
par.ParameterName = name;
par.SourceColumn = srcColumn;
par.SourceColumnNullMapping = true;
par.Value = value == null ? DBNull.Value : value;
return par;
}
public DbParameter CreateParameter(string name, DbType type)
{
DbParameter par = _factory.CreateParameter();
par.ParameterName = name;
par.DbType = type;
return par;
}
public DbParameter CreateParameter(string name, DbType type, int size)
{
DbParameter par = _factory.CreateParameter();
par.ParameterName = name;
par.DbType = type;
par.Size = size;
return par;
}
public DbParameter CreateParameter(string name, DbType type, int size, string srcColumn)
{
return CreateParameter(name, type, size, ParameterDirection.Input, false, srcColumn, DataRowVersion.Current, null);
}
public DbParameter CreateParameter(string name, DbType type, int size, ParameterDirection direction, bool isNullable, string srcColumn, DataRowVersion srcVersion, object value)
{
DbParameter par = _factory.CreateParameter();
par.ParameterName = name;
par.DbType = type;
par.Size = size;
par.Direction = direction;
par.SourceColumnNullMapping = isNullable;
par.SourceColumn = srcColumn;
par.SourceVersion = srcVersion;
par.Value = value;
return par;
}
public void LoadDataSet(DbCommand cmd, DataSet ds, string tableName)
{
LoadDataSet(cmd, ds, new string[] { tableName });
}
public void LoadDataSet(DbTransaction trans, DbCommand cmd, DataSet ds, string tableName)
{
LoadDataSet(trans, cmd, ds, new string[] { tableName });
}
public void LoadDataSet(DbCommand cmd, DataSet ds, string[] tableNames)
{
using (DbConnection con = this.Connection)
{
PrepareCommand(cmd, con);
DoLoadDataSet(cmd, ds, tableNames);
}
}
public void LoadDataSet(DbTransaction trans, DbCommand cmd, DataSet ds, string[] tableNames)
{
PrepareCommand(cmd, trans);
DoLoadDataSet(cmd, ds, tableNames);
}
public DataSet ExecuteDataSet(DbCommand cmd)
{
DataSet ds = new DataSet();
LoadDataSet(cmd, ds, "Table");
return ds;
}
public DataSet ExecuteDataSet(DbTransaction trans, DbCommand cmd)
{
DataSet ds = new DataSet();
LoadDataSet(trans, cmd, ds, "Table");
return ds;
}
public object ExecuteScalar(DbCommand cmd)
{
using (DbConnection con = this.Connection)
{
PrepareCommand(cmd, con);
con.Open();
return cmd.ExecuteScalar();
}
}
public object ExecuteScalar(DbTransaction trans, DbCommand cmd)
{
PrepareCommand(cmd, trans);
return cmd.ExecuteScalar();
}
public int ExecuteNonQuery(DbCommand cmd)
{
using (DbConnection con = this.Connection)
{
PrepareCommand(cmd, con);
con.Open();
return cmd.ExecuteNonQuery();
}
}
public int ExecuteNonQuery(DbTransaction trans, DbCommand cmd)
{
PrepareCommand(cmd, trans);
return cmd.ExecuteNonQuery();
}
public DbDataReader ExecuteReader(DbCommand cmd)
{
DbConnection con = this.Connection;
PrepareCommand(cmd, con);
con.Open();
try
{
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch
{
con.Close();
throw;
}
}
public DbDataReader ExecuteReader(DbTransaction trans, DbCommand cmd)
{
PrepareCommand(cmd, trans);
return cmd.ExecuteReader(CommandBehavior.Default);
}
public int UpdateDataSet(DataSet ds, string tableName, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand)
{
if (insertCommand == null && updateCommand == null && deleteCommand == null)
throw new ArgumentException("InsertCommand, UpdateCommand and DeleteCommand cannot be null all at the same time.");
using (DbConnection con = this.Connection)
{
if (insertCommand != null)
PrepareCommand(insertCommand, con);
if (updateCommand != null)
PrepareCommand(updateCommand, con);
if (deleteCommand != null)
PrepareCommand(deleteCommand, con);
con.Open();
return DoUpdateDataSet(ds, tableName, insertCommand, updateCommand, deleteCommand);
}
}
public int UpdateDataSet(DbTransaction trans, DataSet ds, string tableName, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand)
{
if (insertCommand != null)
PrepareCommand(insertCommand, trans);
if (updateCommand != null)
PrepareCommand(updateCommand, trans);
if (deleteCommand != null)
PrepareCommand(deleteCommand, trans);
return DoUpdateDataSet(ds, tableName, insertCommand, updateCommand, deleteCommand);
}
private int DoUpdateDataSet(DataSet ds, string tableName, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand)
{
if (ds == null) throw new ArgumentNullException("DataSet cannot be null", "ds");
if (tableName == null) throw new ArgumentNullException("The name of the table to update cannot be null.", "tableName");
if (tableName == string.Empty) throw new ArgumentException("The name of the table cannot be an empty string.", "tableName");
using (DbDataAdapter adapter = _factory.CreateDataAdapter())
{
if (insertCommand != null)
adapter.InsertCommand = insertCommand;
if (updateCommand != null)
adapter.UpdateCommand = updateCommand;
if (deleteCommand != null)
adapter.DeleteCommand = deleteCommand;
return adapter.Update(ds, tableName);
}
}
private void PrepareCommand(DbCommand cmd, DbConnection con)
{
if (cmd == null) throw new ArgumentNullException("Command object cannot be null", "cmd");
if (con == null) throw new ArgumentNullException("Connection object cannot be null", "con");
cmd.Connection = con;
}
private void PrepareCommand(DbCommand cmd, DbTransaction trans)
{
if (cmd == null) throw new ArgumentNullException("Command object cannot be null", "cmd");
if (trans == null) throw new ArgumentNullException("Transaction object cannot be null", "trans");
cmd.Connection = trans.Connection;
cmd.Transaction = trans;
}
private void DoLoadDataSet(DbCommand cmd, DataSet ds, string[] tableNames)
{
if (tableNames == null) throw new ArgumentNullException("Array with tablenames cannot be null", "tableNames");
if (tableNames.Length == 0) throw new ArgumentException("The array with tablenames contains no elements", "tableNames");
for (int i = 0; i < tableNames.Length; i++)
{
if (tableNames[i] == null) throw new ArgumentNullException("Table name cannot be null", string.Concat("tableNames[", i, "]"));
if (tableNames[i] == string.Empty) throw new ArgumentException("Table name cannot be an empty string", string.Concat("tableNames[", i, "]"));
}
using (DbDataAdapter adapter = _factory.CreateDataAdapter())
{
adapter.SelectCommand = cmd;
string systemCreatedTableNameRoot = "Table";
for (int i = 0; i < tableNames.Length; i++)
{
string systemCreatedTableName = (i == 0)? systemCreatedTableNameRoot: systemCreatedTableNameRoot + i;
adapter.TableMappings.Add(systemCreatedTableName, tableNames[i]);
}
adapter.Fill(ds);
}
}
#region IDisposable Members
public void Dispose()
{
Connection.Dispose();
}
#endregion
}
}