namespace HW.Utility.Data
|
{
|
using System;
|
using System.Data;
|
using System.Data.Common;
|
|
public class ParameterCache
|
{
|
private CachingMechanism cache = new CachingMechanism();
|
|
protected virtual void AddParametersFromCache(DbCommand command, Database database)
|
{
|
IDataParameter[] cachedParameterSet = this.cache.GetCachedParameterSet(database.ConnectionString, command);
|
foreach (IDataParameter parameter in cachedParameterSet)
|
{
|
command.Parameters.Add(parameter);
|
}
|
}
|
|
private bool AlreadyCached(IDbCommand command, Database database)
|
{
|
return this.cache.IsParameterSetCached(database.ConnectionString, command);
|
}
|
|
protected internal void Clear()
|
{
|
this.cache.Clear();
|
}
|
|
private static IDataParameter[] CreateParameterCopy(DbCommand command)
|
{
|
IDataParameterCollection parameters = command.Parameters;
|
IDataParameter[] array = new IDataParameter[parameters.Count];
|
parameters.CopyTo(array, 0);
|
return CachingMechanism.CloneParameters(array);
|
}
|
|
public void SetParameters(DbCommand command, Database database)
|
{
|
if (command == null)
|
{
|
throw new ArgumentNullException("command");
|
}
|
if (database == null)
|
{
|
throw new ArgumentNullException("database");
|
}
|
if (this.AlreadyCached(command, database))
|
{
|
this.AddParametersFromCache(command, database);
|
}
|
else
|
{
|
database.DiscoverParameters(command);
|
IDataParameter[] parameters = CreateParameterCopy(command);
|
this.cache.AddParameterSetToCache(database.ConnectionString, command, parameters);
|
}
|
}
|
}
|
}
|