Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Один универсальный generic класс для доступа ко всем процедурам в базе
|
|||
|---|---|---|---|
|
#18+
Подскажите, пожалуйста, где можно посмотреть исходники, или пример реализации сабжа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 22:11 |
|
||
|
Один универсальный generic класс для доступа ко всем процедурам в базе
|
|||
|---|---|---|---|
|
#18+
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); } =============================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 23:34 |
|
||
|
Один универсальный generic класс для доступа ко всем процедурам в базе
|
|||
|---|---|---|---|
|
#18+
Если есть вопросы с радостью отвечу =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 23:42 |
|
||
|
Один универсальный generic класс для доступа ко всем процедурам в базе
|
|||
|---|---|---|---|
|
#18+
Прошу прощения - перепутал исходники (наверху старый тестовый вариант). Вот готовый вариант: 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> ;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); } Пожалуйста удалите мой первый пост (т.к я почему-то не нашел такой возможности на этом форуме) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2006, 01:04 |
|
||
|
Один универсальный generic класс для доступа ко всем процедурам в базе
|
|||
|---|---|---|---|
|
#18+
Прошу прощения - перепутал исходники (наверху старый тестовый вариант). Пожалуйста удалите мой первый пост (т.к я почему-то не нашел такой возможности на этом форуме) Здесь удалять посты нельзя. Но можно свои редактировать. Вы можеть удалить все из Вашего поста и дописать что, мол смотрите ниже . Рядом с темой в посте отображается карандаш - это редактирование поста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2006, 10:19 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=34117748&tid=1387716]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 361ms |

| 0 / 0 |
