powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Один универсальный generic класс для доступа ко всем процедурам в базе
5 сообщений из 5, страница 1 из 1
Один универсальный generic класс для доступа ко всем процедурам в базе
    #34117664
Dmitryk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, пожалуйста, где можно посмотреть исходники, или пример реализации сабжа.
...
Рейтинг: 0 / 0
Один универсальный generic класс для доступа ко всем процедурам в базе
    #34117748
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
public delegate T DataRetriever(IDataReader reader);

public abstract class DbParameters
{
CommandType commandType;
String commandText;
String connectionString;
IDictionary commandParameters;

public DbParameters(CommandType commandType, String commandText, String connectionString)
{
this.commandType = commandType;
this.commandText = commandText;
this.connectionString = connectionString;
}

public DbParameters(CommandType commandType, String commandText, String connectionString, IDictionary commandParameters)
: this(commandType, commandText, connectionString) { this.commandParameters = commandParameters; }

public void AddParameterWithValue(String parameterName, Object value)
{
if (String.IsNullOrEmpty(parameterName))
throw new ArgumentNullException("parameterName");

if (commandParameters == null)
commandParameters = new Dictionary();

commandParameters.Add(parameterName, value);
}

public IDictionary CommandParameters { get { return commandParameters; } }

public CommandType CommandType { get { return commandType; } }
public String CommandText { get { return commandText; } }
public String ConnectionString { get { return connectionString; } }
}

public class DataMapper : DbParameters
{
DataRetriever method;

public DataMapper(CommandType commandType, String commandText, String connectionString) : base(commandType, commandText, connectionString) { }

public DataMapper(CommandType commandType, String commandText, String connectionString, IDictionary commandParameters, DataRetriever method)
: base(commandType, commandText, connectionString, commandParameters) { this.method = method; }

public DataRetriever RetrieveMethod { get { return method; } set { method = value; } }
}

public class DAL where T : IDbConnection, new()
{
public static U ExecuteReader(DataMapper dataMapper, bool useTransaction)
{
if (dataMapper == null)
throw new ArgumentNullException("dataMapper");

if (String.IsNullOrEmpty(dataMapper.ConnectionString))
throw new ArgumentNullException("dataMapper.ConnectionString");

using (T connection = new T())
{
connection.ConnectionString = dataMapper.ConnectionString;
using (IDbCommand command = connection.CreateCommand())
{
command.CommandType = dataMapper.CommandType;
command.CommandText = dataMapper.CommandText;

if (dataMapper.CommandParameters != null)
AddParameters(command, dataMapper.CommandParameters);

IDataReader reader = null;
U data;

connection.Open();

if (!useTransaction)
{
try
{
reader = command.ExecuteReader(CommandBehavior.CloseConnection);
data = dataMapper.RetrieveMethod.Invoke(reader);
}
catch (Exception) { throw; }
finally { if (reader != null) reader.Close(); }
}
else
{
using (IDbTransaction transaction = connection.BeginTransaction())
{
command.Transaction = transaction;
try
{
reader = command.ExecuteReader(CommandBehavior.Default);
data = dataMapper.RetrieveMethod.Invoke(reader);
}
catch (Exception) { transaction.Rollback(); throw; }
finally { if (reader != null) reader.Close(); }
transaction.Commit();
}
}
return data;
}
}
}

private static void AddParameters(IDbCommand command, IDictionary commandParameters)
{
foreach (String name in commandParameters.Keys)
{
IDataParameter parameter = command.CreateParameter();
parameter.ParameterName = name;
parameter.Value = commandParameters[name];
command.Parameters.Add(parameter);
}
}
}
ПРимер использования :

public override BasePageIdentity GetPageIdentity(String localPath)
{
if (String.IsNullOrEmpty(localPath)) throw new ArgumentNullException("localPath");

DataMapper dm = new DataMapper(CommandType.StoredProcedure, "[dbo].[GetPageIdentity]", connectionString);
dm.AddParameterWithValue("@PagePath", localPath.ToLower());
dm.RetrieveMethod = delegate(IDataReader reader)
{
int pageId = -1;
int parentId = -1;
String pageTitle;
bool anonymousAccess = false;
List accessRoles = null;

reader.Read();
pageId = reader[0] as int? ?? -1;
parentId = reader[1] as int? ?? 0;
pageTitle = reader[2].ToString();
anonymousAccess = reader[3] as bool? ?? true;

if (pageId != -1 && !anonymousAccess)
{
accessRoles = new List();
reader.NextResult();

while (reader.Read())
accessRoles.Add(reader.GetString(0));
}
return new BasePageIdentity(pageId, parentId, localPath, pageTitle, anonymousAccess, accessRoles == null ? null : accessRoles.ToArray());
};

return DAL.ExecuteReader(dm, false);
}
===============================================
...
Рейтинг: 0 / 0
Один универсальный generic класс для доступа ко всем процедурам в базе
    #34117753
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть вопросы с радостью отвечу =)
...
Рейтинг: 0 / 0
Один универсальный generic класс для доступа ко всем процедурам в базе
    #34117819
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения - перепутал исходники (наверху старый тестовый вариант). Вот готовый вариант:

public delegate T DataRetriever<T>(IDataReader reader);

public class DbParameters
{
CommandType commandType;
String commandText;
String connectionString;
IDictionary<String, Object> commandParameters;

public DbParameters(CommandType commandType, String commandText, String connectionString)
{
this.commandType = commandType;
this.commandText = commandText;
this.connectionString = connectionString;
}

public DbParameters(CommandType commandType, String commandText, String connectionString, IDictionary<String, Object&gt ;commandParameters)
: this(commandType, commandText, connectionString) { this.commandParameters = commandParameters; }

public void AddParameterWithValue(String parameterName, Object value)
{
if (String.IsNullOrEmpty(parameterName))
throw new ArgumentNullException("parameterName");

if (commandParameters == null)
commandParameters = new Dictionary<String, Object>();

commandParameters.Add(parameterName, value);
}

public IDictionary<String, Object> CommandParameters { get { return commandParameters; } }

public CommandType CommandType { get { return commandType; } }
public String CommandText { get { return commandText; } }
public String ConnectionString { get { return connectionString; } }
}

public class DataMapper<T>
{
DataRetriever<T> method;
DbParameters dbParameters;

public DataMapper(DbParameters dbParameters) { this.dbParameters = dbParameters; }

public DataMapper(DbParameters dbParameters, DataRetriever<T> method)
: this(dbParameters)
{ this.method = method; }

public DataRetriever<T> RetrieveMethod { get { return method; } set { method = value; } }
public DbParameters DbParameters { get { return dbParameters; } }
}

public class DAL<T, U> where T : IDbConnection, new()
{
public static U ExecuteReader(DataMapper<U> dataMapper, bool useTransaction)
{
if (dataMapper == null)
throw new ArgumentNullException("dataMapper");

if (String.IsNullOrEmpty(dataMapper.DbParameters.ConnectionString))
throw new ArgumentNullException("dataMapper.ConnectionString");

using (T connection = new T())
{
connection.ConnectionString = dataMapper.DbParameters.ConnectionString;
using (IDbCommand command = connection.CreateCommand())
{
command.CommandType = dataMapper.DbParameters.CommandType;
command.CommandText = dataMapper.DbParameters.CommandText;

if (dataMapper.DbParameters.CommandParameters != null)
AddParameters(command, dataMapper.DbParameters.CommandParameters);

IDataReader reader = null;
U data;

connection.Open();

if (!useTransaction)
{
try
{
reader = command.ExecuteReader(CommandBehavior.CloseConnection);
data = dataMapper.RetrieveMethod.Invoke(reader);
}
catch (Exception) { throw; }
finally { if (reader != null) reader.Close(); }
}
else
{
using (IDbTransaction transaction = connection.BeginTransaction())
{
command.Transaction = transaction;
try
{
reader = command.ExecuteReader(CommandBehavior.Default);
data = dataMapper.RetrieveMethod.Invoke(reader);
}
catch (Exception) { transaction.Rollback(); throw; }
finally { if (reader != null) reader.Close(); }
transaction.Commit();
}
}
return data;
}
}
}

private static void AddParameters(IDbCommand command, IDictionary<String, Object> commandParameters)
{
foreach (String name in commandParameters.Keys)
{
IDataParameter parameter = command.CreateParameter();
parameter.ParameterName = name;
parameter.Value = commandParameters[name];
command.Parameters.Add(parameter);
}
}
}

==============================================
Пример использования:

public override BaseControlState GetControlState(BaseControlIdentity cId)
{
if (cId == null) throw new ArgumentNullException("cId");

DbParameters dbp = new DbParameters(CommandType.StoredProcedure, "[dbo].[GetControlState]", connectionString);
dbp.AddParameterWithValue("@ControlId", cId.ControlId);
dbp.AddParameterWithValue("@PageId", cId.PageIdentity.PageId);
dbp.AddParameterWithValue("@ControlType", cId.ControlType.ToString());

DataMapper<BaseControlState> dm = new DataMapper<BaseControlState>(dbp, delegate(IDataReader reader)
{
reader.Read();
return CMSDAL.XMLSerializer<BaseControlState, UTF8Encoding>.Deserialize(reader.GetString(0), cId.ControlStateType);
});

return DAL<SqlConnection, BaseControlState>.ExecuteReader(dm, false);
}

Пожалуйста удалите мой первый пост (т.к я почему-то не нашел такой возможности на этом форуме)
...
Рейтинг: 0 / 0
Один универсальный generic класс для доступа ко всем процедурам в базе
    #34118422
Chai_nik!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения - перепутал исходники (наверху старый тестовый вариант).
Пожалуйста удалите мой первый пост (т.к я почему-то не нашел такой возможности на этом форуме)

Здесь удалять посты нельзя. Но можно свои редактировать. Вы можеть удалить все из Вашего поста и дописать что, мол смотрите ниже
.

Рядом с темой в посте отображается карандаш - это редактирование поста.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Один универсальный generic класс для доступа ко всем процедурам в базе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]