Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Data Tier Generator - оч интересная штука, токо как его пользовать :( ?! 
:(
    Опции темы
kulibin
Дата 29.6.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



Вот нашол оч интересную технику:
http://sourceforge.net/projects/csharpdatatier/
Генерит классы для всех таблиц в бд и хранимки для инсерта/апдейта/делейта и т.п.
Токо вся работа с бд строится на датаридерах, коммандах и массивах типа этих классов сгенерированных для таблиц. Может для асп это в таком виде и нормально - но под винформз что-то как-то не очень получается smile. А мне именно для этого оно нужно. У меня намечается сейчас проектец довольно объёмный - и что-то такое мне бы очень пригодилось. А по поводу эту технику под винформз пользовать у меня следующие вещи вызывают вопросы и сомнения: 
1. Думаю дататейбл и датароу гораздо удобнее чем массив объектов и объект соответствующий записи в таблице бд. Как такой массив прикрутить к датагридвью? Не будет наверное сортировки и точно не будет фильтрации smile. 
2. Там есть какая-то функция для получения датасета - но как её пользовать шото я не понял. Ну и вообще допустим если использовать всю эту музыку в куче с дататейбл и датасетом - тоже я совсем не понял как это сделать. Руками извлекать данные из датароу и помещать в объект сгенерированый? Чёто не оч удобно как-то smile. 

Ну и вообще просто вот смотрю я эту технику - вижу что очень она интересная - но я что-то не понимаю как её пользовать. Пытался примеры использования искать - ничего не нашол smile. 

Ну и ещё: оно то в принципе в исходниках - т.е. можно его и подправить. Токо не очень я сам понимаю как оно должно работать то. Я шарп токо начинаю учить. Сделал пару програмок мелких на шарпе+склсервер 2005 экспрес. Но на мелких то программках такие навороты может и вообще лишние - но вот на более крупных проектах думаю это просто необходимо. Вот как должен выглядеть класс для работы с таблицей БД? Эта техника генерит классы двух видов:
1.
Код

using System;

namespace cito.db {
    /// <summary>
    /// Provides data access for the tblProizv database table.
    /// </summary>
    [Serializable]
    public sealed class TblProizv {
        private int pk_proizv;
        private string pname;
        private bool import;
        
        public TblProizv() {
        }
        
        public int Pk_proizv {
            get { return pk_proizv; }
            set { pk_proizv = value; }
        }
        
        public string Pname {
            get { return pname; }
            set { pname = value; }
        }
        
        public bool Import {
            get { return import; }
            set { import = value; }
        }
    }
}


и 2:
Код

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;

using cito.db;

namespace cito.db.Data {
    public sealed class TblProizvData {
        private TblProizvData() {}

        /// <summary>
        /// Inserts a record into the tblProizv table.
        /// </summary>
        public static void Insert(TblProizv tblProizv, SqlConnection connection, SqlTransaction transaction) {
            SqlParameter[] parameters = new SqlParameter[] {
                new SqlParameter("@pk_proizv", SqlDbType.Int, 4, ParameterDirection.Output, false, 10, 0, "pk_proizv", DataRowVersion.Proposed, null),
                new SqlParameter("@pname", SqlDbType.NVarChar, 100, ParameterDirection.Input, false, 0, 0, "pname", DataRowVersion.Proposed, tblProizv.Pname),
                new SqlParameter("@import", SqlDbType.Bit, 1, ParameterDirection.Input, false, 0, 0, "import", DataRowVersion.Proposed, tblProizv.Import)
            };

            SqlClientUtility.ExecuteNonQuery(connection, transaction, "tblProizvInsert", parameters);

            tblProizv.Pk_proizv = (int) parameters[0].Value;
        }

        /// <summary>
        /// Updates a record in the tblProizv table.
        /// </summary>
        public static void Update(TblProizv tblProizv, SqlConnection connection, SqlTransaction transaction) {
            SqlParameter[] parameters = new SqlParameter[] {
                new SqlParameter("@pk_proizv", SqlDbType.Int, 4, ParameterDirection.Input, false, 10, 0, "pk_proizv", DataRowVersion.Proposed, tblProizv.Pk_proizv),
                new SqlParameter("@pname", SqlDbType.NVarChar, 100, ParameterDirection.Input, false, 0, 0, "pname", DataRowVersion.Proposed, tblProizv.Pname),
                new SqlParameter("@import", SqlDbType.Bit, 1, ParameterDirection.Input, false, 0, 0, "import", DataRowVersion.Proposed, tblProizv.Import)
            };

            SqlClientUtility.ExecuteNonQuery(connection, transaction, "tblProizvUpdate", parameters);
        }

        /// <summary>
        /// Deletes a record from the tblProizv table by its primary key.
        /// </summary>
        public static void Delete(int pk_proizv, SqlConnection connection, SqlTransaction transaction) {
            SqlParameter[] parameters = new SqlParameter[] {
                new SqlParameter("@pk_proizv", SqlDbType.Int, 4, ParameterDirection.Input, false, 10, 0, "pk_proizv", DataRowVersion.Proposed, pk_proizv)
            };

            SqlClientUtility.ExecuteNonQuery(connection, transaction, "tblProizvDelete", parameters);
        }

        /// <summary>
        /// Selects a single record from the tblProizv table.
        /// </summary>
        public static TblProizv Select(int pk_proizv, SqlConnection connection, SqlTransaction transaction) {
            SqlParameter[] parameters = new SqlParameter[] {
                new SqlParameter("@pk_proizv", SqlDbType.Int, 4, ParameterDirection.Input, false, 10, 0, "pk_proizv", DataRowVersion.Proposed, pk_proizv)
            };

            using (SqlDataReader dataReader = SqlClientUtility.ExecuteReader(connection, transaction, "tblProizvSelect", parameters)) {
                if (dataReader.Read()) {
                    return MakeTblProizv(dataReader);
                } else {
                    return null;
                }
            }
        }

        /// <summary>
        /// Selects all records from the tblProizv table.
        /// </summary>
        public static TblProizv[] SelectAll(SqlConnection connection, SqlTransaction transaction) {
            using (SqlDataReader dataReader = SqlClientUtility.ExecuteReader(connection, transaction, "tblProizvSelectAll")) {
                if (dataReader.HasRows) {
                    ArrayList list = new ArrayList();
                    while (dataReader.Read()) {
                        TblProizv tblProizv = MakeTblProizv(dataReader);
                        list.Add(tblProizv);
                    }
                    return (TblProizv[]) list.ToArray(typeof(TblProizv));
                } else {
                    return null;
                }
            }
        }

        /// <summary>
        /// Creates a new instance of the tblProizv class and populates it with data from the specified SqlDataReader.
        /// </summary>
        private static TblProizv MakeTblProizv(SqlDataReader dataReader) {
            TblProizv tblProizv = new TblProizv();
            
            if (dataReader.IsDBNull(0) == false) {
                tblProizv.Pk_proizv = dataReader.GetInt32(0);
            }
            if (dataReader.IsDBNull(1) == false) {
                tblProizv.Pname = dataReader.GetString(1);
            }
            if (dataReader.IsDBNull(2) == false) {
                tblProizv.Import = dataReader.GetBoolean(2);
            }

            return tblProizv;
        }
    }
}


Чтоли в какой-то из них ещё дататейбл засунуть? Например в первый? 
Может есть у кого-то пример класса для работы с таблицей бд по типу этих? Чтобы под винформз легко было с ним работать: отображать данные в датагридвью, на форме для редактирования отдельной записи. Или может и с этим нормально - токо я не понимаю как? Просветите пожалуйста кто так делал. Я вот как бы понял что есть необходимость в объектно-ориентированном подходе при работе с бд от 10-15 таблиц - но как это реализовать - что-то туго соображаю. Или может кто-то знает наподобие технику - токо чтобы с ней под винформз нормально было работать? Буду очень благодарен за любую информацию на эту тему.  

Это сообщение отредактировал(а) kulibin - 29.6.2006, 23:10
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 30.6.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Это называется O/R Mapping (можно поискать в гугле, или на том же codeproject, RSDN и т.д.)

З.Ы. обычная реализация такого подхода предполагает, что работа идёт с объектами а не DataTable/DataRow. 


--------------------
user posted image
PM MAIL WWW   Вверх
kulibin
Дата 30.6.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



а как в случае использования объектов вместо дататейбл быть с привязкой данных к датагридвью и сортировками и фильтрацией? Как с датасетом - не использовать его вообще? Связи в нём нежду таблицами - тоже никак? 
PM MAIL WWW ICQ   Вверх
arilou
Дата 30.6.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



kulibin, у нас в компании кодогенерация сделана на основе CodeSmith. Техника похожа, но проблемы нет - классы, занимающиеся данными, содержат методы для трансляции из-в DataRow/DataTable. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 30.6.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



На одной конторе используют датасеты в качестве транспорта между сервером и клиентом (веб-сервисы, возвращающие и принимающие датасет), что давало возможность на сервере работать только с объектами, а клиенту отдавать/принимать датасеты. 


--------------------
user posted image
PM MAIL WWW   Вверх
kulibin
Дата 30.6.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



Цитата(arilou @  30.6.2006,  10:56 Найти цитируемый пост)
kulibin, у нас в компании кодогенерация сделана на основе CodeSmith. Техника похожа, но проблемы нет - классы, занимающиеся данными, содержат методы для трансляции из-в DataRow/DataTable. 

примерчик бы классов сгенерированных...а? Там исходники есть - я бы сам подшаманил чего надо. Этот же CodeSmith наверное платный?  

Это сообщение отредактировал(а) kulibin - 30.6.2006, 14:15
PM MAIL WWW ICQ   Вверх
kulibin
Дата 30.6.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



Цитата(mr.DUDA @  30.6.2006,  13:46 Найти цитируемый пост)
На одной конторе используют датасеты в качестве транспорта между сервером и клиентом (веб-сервисы, возвращающие и принимающие датасет), что давало возможность на сервере работать только с объектами, а клиенту отдавать/принимать датасеты. 

а мне вообще это под винформз надо - я никуда ничего передавать/принимать не буду. Меня интересуют токо уменьшение рутинной работы по написанию параметров, хранимок и т.п. - и очень интересна возможность обращения к столбцам таблицы как к свойствам. Ну допустим tblMyTable.FirstFild - как-то так. 
Я вот ещё нарыл одну штуку очень похожую на то, что мне нужно:
www.mygenerationsoftware.com
Генерация классов и хранимок по шаблонам - для любых бд. Там есть много готовых шаблонов и возможность свои создавать на бейсикоподобном языке. Очень интересно - но громоздко как-то и сложно. Мне этого всего не нужно - токо отвлекает и запутывает. А свои шаблоны писать - так мне проще тот генератор с исходниками на шарпе подправить под себя. Тут токо одно узкое место - не очень пока себе представляю как классы эти должны выглядеть. Вторую неделю наверное мысли вокруг этого вертятся - но что-то вдохновение не приходит  smile . 
Дайте плз у кого есть образец классаов для работы с бд для винформз (не с целью пересылки этих классов по серверам - а просто для упрощения работы с объектами адо - датасетами, таблицами, представлениями таблиц и т.п.)
Ну и вообще за любые мысли на тему применения ооп при работе с бд буду очень благодарен. 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 30.6.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



kulibin, можно попробовать в сторону LINQ копнуть, правда не уверен что там что-либо про датасеты есть... 


--------------------
user posted image
PM MAIL WWW   Вверх
arilou
Дата 30.6.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



kulibin, класс, работающий с данными (для таблицы): (первая половина)

Код

/// <summary>
    /// Contains low level database operations for Computer entity
    /// </summary>
    public partial class ComputerFactory : IDisposable
    {
        #region Constructors
        /// <summary>
        /// Default construnctor. Create and open database connection
        /// </summary>
        public ComputerFactory()
        {
            database = new DatabaseConnection(true);
            isInternalConnection = true;
        }

        /// <summary>
        /// Constructor with external database connection
        /// </summary>
        /// <param name="database">Opened database connection object</param>
        public ComputerFactory(DatabaseConnection database)
        {
            this.database = database;
        }
        #endregion
        
        #region Database 
        /// <summary>
        /// Instance of DatabaseConnection class
        /// </summary>
        protected DatabaseConnection database;
        /// <summary>
        /// Gets the underlying database connection
        /// </summary>
        public DatabaseConnection Database
        {
            get { return database; }
        }
        
        /// <summary>
        /// Shows if connection exteranal or internal
        /// </summary>
        protected bool isInternalConnection = false;
        #endregion
        
        #region RowUpdated
        
        /// <summary>
        /// Fires when a row has been updated by the data factory
        /// </summary>
        public event EventHandler< RecordUpdatedEventArgs > OnRecordUpdate;

        /// <summary>
        /// Raises the <see cref="RowUpdated"/> event
        /// </summary>
        protected virtual void OnRowUpdated(RecordUpdatedEventArgs e)
        {
            if(OnRecordUpdate != null)
                OnRecordUpdate(this, e);
        }
        #endregion
        
        #region CRUD operations
        /// <summary>
        /// Add new Computer to the database
        /// </summary>
        /// <param name="computer"> instance</param>
        /// <returns>id of the newly inserted computer row</returns>
        public virtual int Add(Computer computer)
        {            
            IDbCommand command = database.CreateCommand(
                "dbo.ComputersAdd", true);
                
            database.AddCommandParameter(command, "@Description", 
                DbType.String, computer.Description);
            IDbDataParameter identity = database.AddCommandParameter(command, "@ComputerID", 
                DbType.Int32, null, ParameterDirection.Output);
                
            int nrows = database.ExecuteNonQuery(command);
            
            if(nrows > 0)
            {
                computer.ComputerID = (int) identity.Value;
                
                return (int) identity.Value;
            }
            else
                throw new ConcurrencyException("Computers");
        }

        /// <summary>
        /// Updates a datatable of Computer 
        /// </summary>
        /// <param name="dataTable">compatible data table</param>        
        public virtual void Update(DataTable dataTable)
        {
            // Computer[] list = MapRows(dataTable);
            dataTable.DataSet.EnforceConstraints = false;
            
            foreach(DataRow dr in dataTable.Rows)
            {
                Computer computer = new Computer();
                
                UpdateMapping(dr, computer);
                
                RecordUpdatedEventArgs e = new RecordUpdatedEventArgs();
                                
                try
                {
                    e.Record = computer;
                    switch(dr.RowState)
                    {
                        case DataRowState.Modified:
                            Update(computer);
                            break;
                        case DataRowState.Added:
                            Add(computer);
                            break;
                        case DataRowState.Deleted:
                            Delete(computer);
                            break;
                        default:
                            continue;
                    }
                    UpdateMapping(computer, dr);
                }
                catch(Exception ex)
                {
                    e.Exception = ex;
                }
                finally
                {
                    OnRowUpdated(e);
                }
                
                if(e.Cancel)
                {
                    dataTable.RejectChanges();
                    throw new ApplicationException("Batch update was cancelled", e.Exception);
                }
            }
            dataTable.DataSet.EnforceConstraints = true;
            dataTable.AcceptChanges();
        }
        
        /// <summary>
        /// Updates existing Computer in the database
        /// </summary>
        /// <param name="computer"> instance</param>
        public virtual void Update(Computer computer)
        {
            IDbCommand command = database.CreateCommand(
                "dbo.ComputersUpdate", true);
                
            database.AddCommandParameter(command, "@ComputerID", 
                DbType.Int32, computer.ComputerID);
            database.AddCommandParameter(command, "@Description", 
                DbType.String, computer.Description);
            
            if(database.ExecuteNonQuery(command) == 0)
                throw new ConcurrencyException("Computers");
        }

        /// <summary>
        /// Removes Computer from the database. Param list depends on keys. 
        /// </summary>
        public virtual void Delete(int ComputerID )
        {
            IDbCommand command = database.CreateCommand(
                "dbo.ComputersDelete", true);

            database.AddCommandParameter(command, "@ComputerID", 
                DbType.Int32, ComputerID);
            
            database.ExecuteNonQuery(command);
        }
        
                /// <summary>
        /// Removes Computer from the database. Param list depends on keys. 
        /// </summary>
        public virtual void Delete(Computer item)
        {
            IDbCommand command = database.CreateCommand(
                "dbo.ComputersDelete", true);

            database.AddCommandParameter(command, "@ComputerID", 
                DbType.Int32, item.ComputerID);
            
            database.ExecuteNonQuery(command);
        }
        #endregion
        
        #region Different Find methods
        /// <summary>
        /// Looks for Computer in the database.
        /// </summary>
        /// <param name="computer">Information about computer to find</param>
        /// <returns>List of found ComputerEntity</returns>
        public virtual Computer[] Find(Computer computer)
        {
         return Find(computer, Computer.DefaultCompareCriteria());
        }

        /// <summary>
        /// Looks for Computer in the database.
        /// </summary>
        /// <param name="computer">Information about computer to find</param>
        /// <param name="compareCriteria">Compare criteria to make WHERE conditions in database</param>
        /// <returns>List of found Computer</returns>
        public virtual Computer[] Find(Computer computer, Dictionary<string, string> compareCriteria)
        {
         return Find(computer, compareCriteria, "ComputerID", "ASC",
                int.MinValue, int.MinValue);
        }

        /// <summary>
        /// Find ComputerEntity in the database.
        /// </summary>
        /// <param name="computer">Information about computer to find</param>
        /// <param name="orderByColumn">ORDER BY parameter</param>
        /// <param name="orderByDirection">Direction of sorting</param>
        /// <param name="pageNumber">Number of page</param>
        /// <param name="pageSize">Size of page</param>
        /// <returns>List of found Computer</returns>
        public virtual Computer[] Find(Computer computer, String orderByColumn, String orderByDirection, int pageNumber, int pageSize)
        {
         return Find(computer, Computer.DefaultCompareCriteria(),
                orderByColumn, orderByDirection, pageNumber, pageSize);
        }

 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
arilou
Дата 30.6.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



Вторая половина:

Код

        /// <summary>
        /// Find ComputerEntity in the database.
        /// </summary>
        /// <param name="computer">Information about computer to find</param>
        /// <param name="compareCriteria">Compare criteria to make WHERE conditions in database</param>
        /// <param name="orderByColumn">ORDER BY parameter</param>
        /// <param name="orderByDirection">Direction of sorting</param>
        /// <param name="pageNumber">Number of page</param>
        /// <param name="pageSize">Size of page</param>
        /// <returns>List of found ComputerEntity</returns>
        public virtual Computer[] Find(
            Computer computer,
            Dictionary<string, string> compareCriteria, String orderByColumn, String orderByDirection,
            int pageNumber, int pageSize)
        {
            IDbCommand command = database.CreateCommand(
                "dbo.ComputersFind", true);            

            database.AddCommandParameter(command, "@ComputerID", 
                DbType.Int32, computer.ComputerID);
            database.AddCommandParameter(command, "@ComputerIDOperator", 
                DbType.AnsiString, compareCriteria["ComputerID"]);            
                
            database.AddCommandParameter(command, "@Description", 
                DbType.String, computer.Description);
            database.AddCommandParameter(command, "@DescriptionOperator", 
                DbType.AnsiString, compareCriteria["Description"]);            
                
            database.AddCommandParameter(command, "@PageNumber", 
                DbType.Int32, pageNumber);
            database.AddCommandParameter(command, "@PageSize", 
                DbType.Int32, pageSize);
            database.AddCommandParameter(command, "@OrderByField", 
                DbType.AnsiString, orderByColumn);
            database.AddCommandParameter(command, "@OrderDirection", 
                DbType.AnsiString, orderByDirection.ToUpper());
            database.AddCommandParameter(command, "@TotalRecordCount", 
                DbType.Int32, Count(computer, compareCriteria));
                
            using(IDataReader reader = database.ExecuteReader(command))
            {
                return MapRows(reader);
            }
        }        
        #endregion
        
        #region Different Count methods
        /// <summary>
        /// Count Computer in the database.
        /// </summary>
        /// <param name="computer">Information about computer to find and count</param>
        /// <returns>Count of found Computer</returns>
        public virtual int Count(Computer computer)
        {
            return Count(computer, Computer.DefaultCompareCriteria());
        }
        
        /// <summary>
        /// Count Computer in the database.
        /// </summary>
        /// <param name="computer">Information about computer to find and count</param>
        /// <param name="compareCriteria">Compare criteria to make WHERE conditions in database</param>
        /// <returns>Count of found Computer</returns>
        public virtual int Count(Computer computer, Dictionary<string, string> compareCriteria)
        {
            IDbCommand command = database.CreateCommand(
                "dbo.ComputersCount", true);            

            database.AddCommandParameter(command, "@ComputerID", 
                DbType.Int32, computer.ComputerID);

            database.AddCommandParameter(command, "@ComputerIDOperator", 
                DbType.AnsiString, compareCriteria["ComputerID"]);            
                
            database.AddCommandParameter(command, "@Description", 
                DbType.String, computer.Description);

            database.AddCommandParameter(command, "@DescriptionOperator", 
                DbType.AnsiString, compareCriteria["Description"]);            
                
            return (int)database.ExecuteScalar(command);
        }
        #endregion

        #region ListAll
        /// <summary>
        /// Get all ComputerEntity from the database.
        /// </summary>
        public virtual Computer[] ListAll()
        {
         return Find(Computer.Empty);
        }
        #endregion
        
        #region Get
        /// <summary>
        /// Get Computer by keys. Param list depends on keys. 
        /// </summary>
        public virtual Computer Get(int computerID )
        {
            Computer computer = new Computer();
            computer.ComputerID = computerID;
            
            Computer[] computers = Find(computer);
            
            if (computers.Length > 0 )
                return computers[0];
            else
                return null;
        }
        #endregion
        
        #region Mapping methods
        /// <summary>
        /// Maps relational data to entity this factory is designed for
        /// </summary>
        /// <param name="reader">Open reader that contans Entity data to map</param>
        /// <returns>Populated entity instance</returns>
        protected virtual Computer[] MapRows(DataTable dataTable)
        {
            List< Computer > computers = 
                new List< Computer >();
            
            foreach(DataRow row in dataTable.Rows)
            {
                Computer computer = new Computer();
                
                
                if (row["ComputerID"] != null && row["ComputerID"].GetType() != typeof(DBNull)) 
                {
                    computer.ComputerID = (Int32)row["ComputerID"];
                }
                
                if (row["Description"] != null && row["Description"].GetType() != typeof(DBNull)) 
                {
                    computer.Description = (String)row["Description"];
                }
                
                computers.Add(computer);
            }
            
            return computers.ToArray();
        }
        
        /// <summary>
        /// Maps relational data to entity this factory is designed for
        /// </summary>
        /// <param name="reader">Open reader that contans Computer data to map</param>
        /// <returns>Populated entity instance</returns>
        protected virtual Computer[] MapRows(IDataReader reader)
        {            
            List< Computer > computers = 
                new List< Computer >();
            
            int computerIDIndex = reader.GetOrdinal("ComputerID");
            int descriptionIndex = reader.GetOrdinal("Description");

            while(reader.Read())
            {
                Computer computer = new Computer();
                computers.Add(computer);

                if (!reader.IsDBNull(computerIDIndex)) 
                computer.ComputerID = reader.GetInt32(computerIDIndex); 
                if (!reader.IsDBNull(descriptionIndex)) 
                computer.Description = reader.GetString(descriptionIndex); 
            }
            
            return computers.ToArray();
        }
        
        /// <summary>
        /// Creates DataTable for storing Entity list.
        /// </summary>
        /// <returns>Empty DataTable</returns>
        public static DataTable CreateDataTable()
        {
            DataTable dataTable = new DataTable();
            dataTable.TableName = "Computers";
            DataColumn dataColumn;
            
            dataColumn = dataTable.Columns.Add("ComputerID", typeof(int));
            dataColumn = dataTable.Columns.Add("Description", typeof(String));
            dataColumn.MaxLength = 100;
            
            return dataTable;
        }
        
        /// <summary>
        /// Maps the Entity to a DataTable Row.
        /// </summary>
        /// <returns>DataRow with Entity information</returns>
        private static DataRow MapEntityToRow(Computer computer, DataTable dataTable)
        {        
            DataRow row = dataTable.NewRow();
            
            row["ComputerID"] = computer.ComputerID;
            row["Description"] = computer.Description;
            
            dataTable.Rows.Add(row);
            return row;
        }

        /// <summary>
        /// Maps the Entity to a DataTable Row.
        /// </summary>
        private static void UpdateMapping(Computer source, DataRow destination)
        {        
            
            #region ComputerID column
            DataColumn colComputerID = destination.Table.Columns["ComputerID"];
            bool isComputerIDReadOnly = false;
            
            if(colComputerID != null)
            {
                isComputerIDReadOnly = colComputerID.ReadOnly;
                colComputerID.ReadOnly = false;
            }
            
            destination["ComputerID"] = source.ComputerID;
            
            if(colComputerID != null)
                colComputerID.ReadOnly = isComputerIDReadOnly;

            #endregion
            
            
            #region Description column
            DataColumn colDescription = destination.Table.Columns["Description"];
            bool isDescriptionReadOnly = false;
            
            if(colDescription != null)
            {
                isDescriptionReadOnly = colDescription.ReadOnly;
                colDescription.ReadOnly = false;
            }
            
            destination["Description"] = source.Description;
            
            if(colDescription != null)
                colDescription.ReadOnly = isDescriptionReadOnly;

            #endregion
            
        }
        
        /// <summary>
        /// Maps the DataTable row to an entity
        /// </summary>
        private static void UpdateMapping(DataRow source, Computer destination)
        {        
            destination.ComputerID = (int)source["ComputerID"];
            destination.Description = (String)source["Description"];
        }
        
        /// <summary>
        /// Map Entities to DataTable.
        /// </summary>
        /// <returns>DataTable with Entities information</returns>
        public static DataTable MapEntityToDataTable(Computer[] computerList)
        {        
            DataTable dataTable = ComputerFactory.CreateDataTable();
            foreach(Computer computer in computerList)
                ComputerFactory.MapEntityToRow(computer, dataTable);
            
            return dataTable;
        }    

        #endregion

        #region Helpers
        #endregion

        #region IDisposable implementation
        /// <summary>
        /// Closes and disposes of the database connection 
        /// </summary>
        public void Dispose()
        {
            if (isInternalConnection)
                database.Dispose();
        }
        #endregion

    }


Добавлено @ 17:04 
Это автосгенеренный код, поэтому там есть куча дублированного кода. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
kulibin
Дата 30.6.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



Цитата(mr.DUDA @  30.6.2006,  16:54 Найти цитируемый пост)
kulibin, можно попробовать в сторону LINQ копнуть, правда не уверен что там что-либо про датасеты есть... 

я копал немного и в эту сторону. мало что понял. понял что там наверное все операции с дататейблами и т.п. подменяются объектами. честно говоря не знаю - наверное это больше под веб пойдёт. и уж точно не в восторге от всяких потуг заменить скл для запросов - это точно тормоза будут. Хотя не знаю - оно как-то туговато сама концепция в голове укладывается.  Уж и не знаю. Думаю может сделать класс-наследником от дататейбл абстрактный и к нему прикрутить сразу адаптер, комманды и т.п. - а его потомков уже прикручивать к конкретной таблице в бд - со свойствами для названиев столбцов и/или чтобы из дефаултвью значения уже брались текущей записи. Ну и там уже или тот опенсючный генератор перекраивать - или шаблоны свои рисовать. Как-то так вобщем нужно. А самое пока узкое место - это понять как классы то эти строить. Как я понял в результате долгих поисков готовое таке я врядли найду - так что токо или переделывать - или по шаблонам.  
PM MAIL WWW ICQ   Вверх
kulibin
Дата 30.6.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



arilou, интересный код. сидю перевариваю. пока не очень понял - но вроде похоже на то, что я хотел - может и полностью - но похоже. спасибо. 
PM MAIL WWW ICQ   Вверх
kulibin
Дата 30.6.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



arilou, или я чего-то не понял - или мне код этот не очень нравится. даже затрудняюсь сказать чем не нравится. Что-то не могу понять преимуществ особенных которые он может дать. 
Блин - вариантов не меряно - а выбрать очень трудно. Наверное легче и быстрее своё что-то слепить.  Пол дня сидю медитирую над вопросом что бы это могло быть smile - пока света в конце тунеля не видно. Видно то, чего я хочу - это не совсем о/р маппинг - или даже совсем не он. Блин - плохо, когда не знаеш чего хочеш smile. А может опыта маловато в создании приложений для бд на шарпе - и от этого нет полной ясности. Ех - подумаю ещё сегодня вечером - и если не осенит - буду как обычно всё делать. А так хотелось к ооп приобщиться smile.
 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 30.6.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(kulibin @  30.6.2006,  18:46 Найти цитируемый пост)
arilou, или я чего-то не понял - или мне код этот не очень нравится. даже затрудняюсь сказать чем не нравится. Что-то не могу понять преимуществ особенных которые он может дать. 

Тем, что автогенерируется по описанию smile 


--------------------
user posted image
PM MAIL WWW   Вверх
kulibin
Дата 1.7.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



Цитата(mr.DUDA @  30.6.2006,  20:21 Найти цитируемый пост)
Цитата(kulibin @  30.6.2006,  18:46 )    
arilou, или я чего-то не понял - или мне код этот не очень нравится. даже затрудняюсь сказать чем не нравится. Что-то не могу понять преимуществ особенных которые он может дать.  

Тем, что автогенерируется по описанию  

Не оч понял - "тем, что генерируется" или "по описанию"? Тем, что автогенерируется наоборот нравится. По поводу описания - это типа как nhibernate? ну вообщето думаю наврядли - наверное там прога-генератор сама бд анализирует. Я задолбался просто делать постоянно одно и то же по нескольку раз: сначала в бд поля описывать - а потом то же самое в параметрах коммандов писать. Ну и много других операций рутинных. Автогенерация конечно лишает гибкости и местами запутывает - но это дело очень нужное и надо его осваивать. Токо вот насчёт гибкости - думаю чтобы она сильно не страдала надо не очень наворачивать с генерацией. Почему меня и настораживают сильно уж наляпистые результаты генерации. Буду своё что-то думать. Вот взялся осваивать написание шаблонов под MyGeneration. Прикольная штука. Оч интересно - жалко нет возможности нормально на это дело налечь. Буду потихоньку вечерами учиться. И по ходу медитировать над тем, как же всётаки должен выглядеть результат генерации. Если у когото есть не очень наляпаные образцы классов для работы с бд использующих дататейбл и адаптер - буду очень благодарен.  
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.