|
|
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Data Access Layer разрабатываю открытый проэкт доступа к данным , всё построенно на ООП , БД описываеться в виде классов , после чего имееться возможность полноценной работы с бд (управление соединением , транзакциями , выполнение процедур, комманд, получение данных и т.д.) , количество кода сводиться к минимуму при совпадении названий в БД и в программе. Все кому интересно пишите свои предложения и пожелания ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 10:54 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Какие подобные проекты смотрели и чем они не устроили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 11:05 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
смотрел несколько проэктов , если делаю что то своё то наверно что то не устроило в других , причины есть разные , одни проэкты платные в других закрыты коды и изменить ничего не можеш в третьих писать кучу кода в четвёртых нет каких то возможностей в пятых хуже быстродействие и т.д. вобщем везде есть недостатки и в том что я делю думаю найдуться но всё же удобного мне DAL-а не встречал поэтому приходиться писать свой , на будущее пожалуйста пржде чем судить скачайте посмотрите попробуйте , потом критикуйте только без грязи и спама а конкретно что где не так (если можно как это исправить ) что добавить и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 11:33 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-offсмотрел несколько проэктов И все же -- какие именно? dim-on-smirn-off , если делаю что то своё то наверно что то не устроило в других , причины есть разные , одни проэкты платные в других закрыты коды и изменить ничего не можеш в третьих писать кучу кода в четвёртых нет каких то возможностей в пятых хуже быстродействие и т.д. вобщем везде есть недостатки и в том что я делю думаю найдуться но всё же удобного мне DAL-а не встречал поэтому приходиться писать свой , Вы, надеюсь, понимаете, что прежде чем садиться писать свой велосипед с квадратными колесами (чем, сказать честно, ваши 600+ строк кода и являются), стоит ознакомиться с широким ассортиментом ORM и RSM-средств различных степеней сложности, открытости, скорости, бесплатности и фичастости. dim-on-smirn-off на будущее пожалуйста пржде чем судить скачайте посмотрите попробуйте , потом критикуйте только без грязи и спама а конкретно что где не так (если можно как это исправить ) что добавить и т.д. Если вы настаиваете, то извольте. Но я тут даже не знаю, с какого конца подступиться... Во-первых, если бы вы действительно попробовали в работе хотя бы пару самых известных мапперов/генераторов, то дизайн вашего детища был бы другой (точнее, он бы там присутствовал -- уж простите великодушно). Во-вторых, вообще непонятно позиционирование вашей библиотеки. Она, насколько я могу судить по коду, задумывалась исключительно для работы с хранимыми процедурами? Зачем же тогда описывать таблицы (public class Table<TEntity>) ? Кроме того, зачем мне для каждой хранимой процедуры сочинять отдельный класс? В-третьих, какие из этих терминов вам знакомы: Identity Map, Unit of Work, Metadata Mapping, Identity Field? В-четвертых, вы жестко прибили ваш DAL к SQL Server'у. В-пятых, про быстродействие можете больше даже не заикаться: у вас безумное количество вызовов CreateInstance(), GetValue() и SetValue() -- а это самые дорогие операции. Ну и не говоря уже о постоянном дергании GetCustomAttributes(). Ну вот. И это только по верхам... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 12:19 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
насколько я могу судить по коду, задумывалась исключительно для работы с хранимыми процедурами ошибочка :) можно и sql писать Зачем же тогда описывать таблицы (public class Table<TEntity>) ? Кроме того, зачем мне для каждой хранимой процедуры сочинять отдельный класс? TEntity указываеться потому как в Table имееться сразу методы для получения изменения данных и т.д. В-четвертых, вы жестко прибили ваш DAL к SQL Server'у. я его туда не прибивал какой провайдер в конфиге будет тот и будет юзаться В-пятых, про быстродействие можете больше даже не заикаться: у вас безумное количество вызовов CreateInstance(), GetValue() и SetValue() -- а это самые дорогие операции. Ну и не говоря уже о постоянном дергании GetCustomAttributes(). быстродействие необязательно искать там :) , есть другие места где в других далах тратяться ресурсы ... по быстродействию сравнивал с Web Service Software Factory там у меня было в несколько раз приимущество. Вы, надеюсь, понимаете, что прежде чем садиться писать свой велосипед с квадратными колесами (чем, сказать честно, ваши 600+ строк кода и являются), стоит ознакомиться с широким ассортиментом ORM и RSM-средств различных степеней сложности, открытости, скорости, бесплатности и фичастости. эти 600 строк написанны в один день собственно поэтому могут и казаться вам квадратными, чем раньше начнёш что то делать тем больше сделаеш я начал недавно писать этот дал и думаю впереди достаточно времени для совершенствования .... P.S. если хотите сделать доброе дело то наставте меня на путь истенный и покажите мне бесплатный гибкий простой ДАЛ. с удовольствием буду юзать если сочту что вы правы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 12:35 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
сории забыл отвтетить Кроме того, зачем мне для каждой хранимой процедуры сочинять отдельный класс это делаеться для того чтобы знать сегнатуру процедуры при вызове , сейчас работаю над этим вопросом хотя не уверен что нужно что то менять . кстати есть визард который весь дал генерит автоматом так что количество процедур не играет роли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 12:40 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-offошибочка :) можно и sql писать Прям в коде? dim-on-smirn-off TEntity указываеться потому как в Table имееться сразу методы для получения изменения данных и т.д. И зачем для этих целей описывать таблицу? dim-on-smirn-off я его туда не прибивал какой провайдер в конфиге будет тот и будет юзаться А это что? Код: plaintext 1. 2. 3. 4. 5. dim-on-smirn-off быстродействие необязательно искать там :) , есть другие места где в других далах тратяться ресурсы Тогда расскажите, где искать и где что тратится. dim-on-smirn-off ... по быстродействию сравнивал с Web Service Software Factory там у меня было в несколько раз приимущество. Энто где весь DAL на датасетах? И прям таки в несколько раз? dim-on-smirn-off эти 600 строк написанны в один день собственно поэтому могут и казаться вам квадратными, чем раньше начнёш что то делать тем больше сделаеш я начал недавно писать этот дал и думаю впереди достаточно времени для совершенствования .... Советую выкинуть, осмотреться, и если уж так хочется, с учетом увиденного сделать более качественную вещь. dim-on-smirn-off если хотите сделать доброе дело то наставте меня на путь истенный и покажите мне бесплатный гибкий простой ДАЛ. с удовольствием буду юзать если сочту что вы правы Повторяю вопрос -- какие вы уже смотрели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 12:50 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-offэто делаеться для того чтобы знать сегнатуру процедуры при вызове , сейчас работаю над этим вопросом хотя не уверен что нужно что то менять . кстати есть визард который весь дал генерит автоматом так что количество процедур не играет роли Вообще нелепость. Параметры, в принципе, derive'атся -- да и опять же, можно пойти от обратного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 12:51 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Прям в коде? прямо в коде [SQL("select * from test where ID = @ID") TestSQL : StoredProcedure { public Guid ID; } что то вроде этого , хотя StoredProcedure стоило больше назвать Command или в этом духе потому как он и просто SQL может пользовать И зачем для этих целей описывать таблицу? для этих целей потомму что в этом классе как раз будут содержаться методы по работе с таблицой как я уже писал существуют предопределённые , можно создаваать свои А это что? в чём проблемма ? И прям таки в несколько раз? таки да Советую выкинуть, осмотреться, и если уж так хочется, с учетом увиденного сделать более качественную вещь. может больше такого совета не давать (бесполезно) , я просил конкретное название Повторяю вопрос -- какие вы уже смотрели? названия не особо запоминаю тго что мне не нравиться , повторяю вопрос скажите что вы считаете нужно пользовать конкретно НАЗВАНИЕ Вообще нелепость. Параметры, в принципе, derive'атся -- да и опять же, можно пойти от обратного. и как их потом указывать ?? что то типа Parametr.Add("ID",Value) или лучше всётаки sp.ID = Value , в таком виде вы никогда не допустите ошибку в названии параметра и легко сможете его переименовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 13:03 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Энто где весь DAL на датасетах? И прям таки в несколько раз? кстати там нет DataSet ов там данные из DataReader мапяться в Entity ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 13:05 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-offпрямо в коде Очень плохо. dim-on-smirn-offв чём проблемма ? Проблема в том, что, например, в Оракле префикс для именованных параметров -- символ двоеточия (":") а не "@". dim-on-smirn-offназвания не особо запоминаю тго что мне не нравиться , повторяю вопрос скажите что вы считаете нужно пользовать конкретно НАЗВАНИЕ Из чего я делаю вывод, что ничего вы не смотрели. Конкретно название -- BLToolkit, NHibernate, iBATIS.NET. dim-on-smirn-off и как их потом указывать ?? что то типа Parametr.Add("ID",Value) или лучше всётаки sp.ID = Value , в таком виде вы никогда не допустите ошибку в названии параметра и легко сможете его переименовать Нет, что-то типа: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 13:13 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Проблема в том, что, например, в Оракле префикс для именованных параметров -- символ двоеточия (":") а не "@". это можно вынести в конфиг , также как и SQL код [StoredProcedure("User_GetUserByLogin")] public abstract User GetUserByLogin(string @login); при описании метода вы делеаете тоже самое что и я при описании процедуры, вопрос как в таком случае задать имя параметра процедуры и тип параметра In или Out немного рассматривал BLToolkit, NHibernate скажу сразу что последний требует много времени для изучения как я уже говорил что недостатки можно найти везде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 13:24 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-offэто можно вынести в конфиг , также как и SQL код Это уже сделано? Можно-то много чего. dim-on-smirn-off при описании метода вы делеаете тоже самое что и я при описании процедуры Сравните добавление одного класса с отдельным полем на каждый параметр хранимки и определение одного метода. dim-on-smirn-off как в таком случае задать имя параметра процедуры Совпадает с названием параметра функции. dim-on-smirn-off и тип параметра In или Out По умолчанию -- in. Модификатор "out" для формальных параметров вам знаком? dim-on-smirn-offнемного рассматривал BLToolkit И чем не угодил? dim-on-smirn-off , NHibernate скажу сразу что последний требует много времени для изучения Добро пожаловать в Castle.ActiveRecord. dim-on-smirn-offкак я уже говорил что недостатки можно найти везде Ни одного так и не услышал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 13:30 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Сравните добавление одного класса с отдельным полем на каждый параметр хранимки и определение одного метода. на каждый параметр создаёться поле а не класс public class User:StoredProcedure { [InParametr] public Guid ID; [InParametr] public string Name; [InParametr] public string Desc; } или [StoredProcedure("User_GetUserByLogin")] public abstract User GetUserByLogin ( Guid @ID, string @Name, string @Desc ); не вижу большой разницы , кстати где задать значение по умолчанию(не путать со значением поумолчанию в процедуре представим что процедура системная и изменить её нельзя) По умолчанию -- in. Модификатор "out" для формальных параметров вам знаком? очень даже , вопрос как быть в том случае если я хочу метод который принимает out парметр а процедура онного не имеет ? кстати как быть если я хочу передать в метод объект например сделать public void Save(User u); ? в моём случае он есть сразу думаю у вас тоже но если нужно сделать свой метод то как быть ? сразу привожу пример public class sp_Use_Saver:StoredProcedure { [InParametr] public Guid ID; [InParametr] public string Name; [InParametr] public string Desc; } public void Save(User u) { db.ExecuteSP(typeof(sp_Use_Saver),u); } кстати где в вашем случае описываеться маппинг ? я так подозреваю в Entity то ещё вопрос как быть если у меня есть таблица Users где поле UserID и есть например View там тоже поле но уже просто ID как мне его промапить в одно и тоже Entity ???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:07 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
кстати ещё не услышал как можно задать имя параметра если оно отличаеться от имени параметра в процедуре ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:08 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-off Проблема в том, что, например, в Оракле префикс для именованных параметров -- символ двоеточия (":") а не "@". это можно вынести в конфиг , также как и SQL код Хм, а у OleDB провайдера вообще именованых параметров нет. Тоже в конфиг? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:11 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Хм, а у OleDB провайдера вообще именованых параметров нет. Тоже в конфиг? :) немного не понял суть если можно на небольшом примере ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:13 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-off Хм, а у OleDB провайдера вообще именованых параметров нет. Тоже в конфиг? :) немного не понял суть если можно на небольшом примере MSDN: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:17 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-off на каждый параметр создаёться поле а не класс Я это понял. Но по классу на каждую хранимку (а в классе кроме полей должны быть еще и конструкторы, для более-менее удобной работы) -- это перебор. dim-on-smirn-off [StoredProcedure("User_GetUserByLogin")] public abstract User GetUserByLogin ( Guid @ID, string @Name, string @Desc ); Это что было? Данный метод в моем варианте вызывает хранимку User_GetUserByLogin, передает ей параметр login и возвращает объект класса User. А вы чего наворотили? dim-on-smirn-offне вижу большой разницы А я вижу. dim-on-smirn-off , кстати где задать значение по умолчанию(не путать со значением поумолчанию в процедуре представим что процедура системная и изменить её нельзя) Методы можно перегружать. Вот в перегрузках хоть обзадавайтесь. dim-on-smirn-offвопрос как быть в том случае если я хочу метод который принимает out парметр а процедура онного не имеет ? Мы об одном и том же говорим? Я, например, об уровне доступа к данным. Но уж если так хочется, то всегда можно сделать перегруженный метод и в нем играться с параметрами как душе угодно. dim-on-smirn-off кстати как быть если я хочу передать в метод объект например сделать public void Save(User u); ? в моём случае он есть сразу думаю у вас тоже но если нужно сделать свой метод то как быть ? сразу привожу пример Одна строчка моего кода против ваших десяти: Код: plaintext кстати где в вашем случае описываеться маппинг ? Где хотите. В коде, в XML-файле, в INI-файле... dim-on-smirn-off я так подозреваю в Entity то ещё вопрос как быть если у меня есть таблица Users где поле UserID и есть например View там тоже поле но уже просто ID как мне его промапить в одно и тоже Entity ???? Как угодно. dim-on-smirn-offкстати ещё не услышал как можно задать имя параметра если оно отличаеться от имени параметра в процедуре ?? Что-то очень много вопросов, вам не кажется? Вы, помнится, просили покритиковать и оценить. Но уж если "отличаеться", то опять перегружайте метод и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:20 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
public void CreateMyOleDbCommand(OleDbConnection connection, string queryString, OleDbParameter[] parameters) { OleDbCommand command = new OleDbCommand(queryString, connection); command.CommandText = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?"; command.Parameters.Add(parameters); for (int j=0; j<parameters.Length; j++) { command.Parameters.Add(parameters[j]) ; } string message = ""; for (int i = 0; i < command.Parameters.Count; i++) { message += command.Parameters .ToString() + "\n"; } Console.WriteLine(message); } я уже писал [SQL("select * from test where ID = @ID") TestSQL : StoredProcedure { public Guid ID; } будет работать потму как перед выполнением команды SQL @ID заменяеться значением . с бинарным полем правда не прокатит... думаю найду решение (спасибо за подсказку) на самом деле задумываеться как DAL SQL Server 2005 а потдержка других баз не есть приоритет и делаеться по возможности , но всё же буду исправляться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:24 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
dim-on-smirn-off я уже писал [SQL("select * from test where ID = @ID") TestSQL : StoredProcedure { public Guid ID; } будет работать потму как перед выполнением команды SQL @ID заменяеться значением . То есть, на сервер у вас отправляется не параметризованный запрос, а сконктатенированная строка, правильно я понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:34 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Это что было? Данный метод в моем варианте вызывает хранимку User_GetUserByLogin, передает ей параметр login и возвращает объект класса User. А вы чего наворотили? извеняюсь имя нужно изменить :) просто скопировал с примера и не аккуратно исправил Методы можно перегружать. Вот в перегрузках хоть обзадавайтесь. да только на каждый параметр нужна перегрузка если их 10 ?? , и могут быть произвольно заданы те или инные сколько вариантов ?? Одна строчка моего кода против ваших десяти: вы наверно не так понялми я сказал не стандартный метод а собственный , т.е. представим что у вас есть два типа Save один вызывает процедуру и второй SaveEx вызывает другую как быть ? как это всё описывать ? Где хотите. В коде, в XML-файле, в INI-файле... чудесно а если приложение работает на клиенте вы емуу даёте доступ к маппингу и если что то поменялос искать это в тысячахстроках кода и постоянно переключаться между кодом и XML файлом ? Как угодно. а примерчик преведёте ? Что-то очень много вопросов, вам не кажется? Вы, помнится, просили покритиковать и оценить. Но уж если "отличаеться", то опять перегружайте метод и всё. не боитесь перегрузить код перегрузками ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:34 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
То есть, на сервер у вас отправляется не параметризованный запрос, а сконктатенированная строка, правильно я понимаю? в случае с SQL то пока да но я это исправляю уже писал , процедуры идут как положено :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:35 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Что-то очень много вопросов, вам не кажется? вопросы потому что вы говорите что это плохо но чтобы что то сделать хорошо нужно знать что делать как делать и как это обстоит в других проэктах :) , а такие вопросы и толкают на создание своего потому что не находяться красивые решения у других ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:37 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=35232960&tid=1352300]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 358ms |

| 0 / 0 |
