Пример #1
0
        /// <summary>
        /// 主キーでレコードを特定し、
        /// 主キー以外の列をエンティティの値で更新する。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dataEntity"></param>
        public void Update <T>(DataEntity <T> dataEntity) where T : DataEntity <T>, new()
        {
            DbTableAttribute table = DataEntity <T> .GetTableAttribute();

            List <IDbDataParameter> parameters = new List <IDbDataParameter>();
            string sql = @"UPDATE " + table.Name + " SET ";

            var elements = DataEntity <T> .GetElements();

            var keys = elements.FindAll(p => p.Key.IsPrimaryKey);

            if (keys.Count == 0)
            {
                throw new ApplicationException("主キーの無いテーブルへの更新は許可されていません。");
            }

            if (elements.Count == 0)
            {
                return;
            }

            foreach (var element in elements)
            {
                var column = element.Key;

                if (column.IsPrimaryKey)
                {
                    continue;
                }

                var property = element.Value;

                object val = property.GetValue(dataEntity, null);
                if (property.PropertyType == typeof(byte[]))
                {
                    string parameterName = this.GetParameterName(column.Name);
                    sql += column.Name + " = " + parameterName + ", ";
                    parameters.Add(this.CreateDataParameter(parameterName, val, column.TypeName));
                }
                else
                {
                    sql += column.Name + " = " + this.ConvertToSqlValue(val, property.PropertyType, element.Key.Nullable) + ", ";
                }
            }

            sql  = sql.Substring(0, sql.Length - 2) + " ";
            sql += CreateWhereClause <T>(keys, dataEntity);

            this.ExecuteNonQuery(sql, parameters);
        }
Пример #2
0
        /// <summary>
        /// エンティティの主キーを元に、テーブルの列を削除します。
        /// </summary>
        /// <typeparam name="T">エンティティを指定します。</typeparam>
        /// <param name="dataEntity">データエンティティを指定します。</param>
        public void Delete <T>(DataEntity <T> dataEntity) where T : DataEntity <T>, new()
        {
            var keys = DataEntity <T> .GetKeyElements();

            if (keys.Count == 0)
            {
                throw new ApplicationException("主キーの無いテーブルへのDELETE文の発行は許可されていません。");
            }

            DbTableAttribute table = DataEntity <T> .GetTableAttribute();

            string sql = @"DELETE FROM " + table.Name + " " + CreateWhereClause <T>(keys, dataEntity);

            this.ExecuteNonQuery(sql);
        }
Пример #3
0
        /// <summary>
        /// sourceに与えられたエンティティのプロパティを
        /// 自分に入れ込む DbColumn属性があるものだけ
        /// </summary>
        /// <param name="source"></param>
        public void Fill(DataEntity <T> source)
        {
            var elements = GetElements();

            foreach (var element in elements)
            {
                if (!element.Value.CanWrite)
                {
                    continue;
                }

                object val = element.Value.GetValue(source, null);
                element.Value.SetValue(this, val, null);

                //if (property.PropertyType.IsValueType || property.PropertyType.Equals(typeof(string)) || property.PropertyType == typeof(byte[]))
                //{

                //}
            }
        }
Пример #4
0
        /// <summary>
        /// 主キーを指定するWHERE句を自動生成する。
        /// NULLを指定する事は無いものとする。
        /// elementsが0個の場合空文字列を返す
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="elements"></param>
        /// <param name="dataEntity"></param>
        /// <returns></returns>
        internal virtual string CreateWhereClause <T>(List <KeyValuePair <DbColumnAttribute, PropertyInfo> > elements, DataEntity <T> dataEntity) where T : DataEntity <T>, new()
        {
            if (elements.Count == 0)
            {
                return(string.Empty);
            }

            string sql = " WHERE ";

            foreach (var element in elements)
            {
                var    column   = element.Key;
                var    property = element.Value;
                object val      = property.GetValue(dataEntity, null);
                sql += column.Name + " = " + this.ConvertToSqlValue(val, property.PropertyType, element.Key.Nullable) + " AND ";
            }

            sql = sql.Substring(0, sql.Length - 5);
            return(sql);
        }
Пример #5
0
        /// <summary>
        /// INSERT文を自動生成し、実行する
        /// 新しく発行されたオートナンバーがある場合、
        /// 新しく発行した値をエンティティに入れる。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dataEntity"></param>
        public void Insert <T>(DataEntity <T> dataEntity) where T : DataEntity <T>, new()
        {
            DbTableAttribute table = DataEntity <T> .GetTableAttribute();

            //オラクルで";"を後ろにつけると動かないらしい
            string sql    = "INSERT INTO {0} ({1}) VALUES ({2})";
            string items  = string.Empty;                                       //項目羅列部
            string values = string.Empty;                                       //値羅列部
            List <IDbDataParameter> parameters = new List <IDbDataParameter>(); //パラメーターリスト

            var elements = DataEntity <T> .GetElements();

            foreach (var element in elements)
            {
                var column = element.Key;
                if (column.IsAutoNumber)
                {
                    continue;
                }

                items += column.Name + ", ";

                var    property = element.Value;
                object val      = property.GetValue(dataEntity, null);

                //byte[]の更新のみパラメータークエリを使用する
                if (property.PropertyType == typeof(byte[]))
                {
                    string parameterName = this.GetParameterName(column.Name);
                    values += parameterName + ", ";
                    parameters.Add(this.CreateDataParameter(parameterName, val, column.TypeName));
                }
                else
                {
                    values += this.ConvertToSqlValue(val, property.PropertyType, element.Key.Nullable) + ", ";
                }
            }

            items  = items.Substring(0, items.Length - 2);
            values = values.Substring(0, values.Length - 2);
            sql    = string.Format(sql, new object[] { table.Name, items, values });

            if (!elements.Exists(p => p.Key.IsAutoNumber))
            {
                this.ExecuteScalar(sql, parameters);
                return;
            }

            //オートナンバー取得用、自動INCREMENT列がある場合に値が返る
            //SqlServerのみ対応した。OracleSEQUENCEはだれかやってもらいたい
            sql += this.AutoNumberGetSql;

            object id = this.ExecuteScalar(sql, parameters);

            //自動INCREMENT列が無い場合、nullが返る
            if (id == null)
            {
                return;
            }

            //採番された番号をエンティティに設定する
            var key          = elements.Find(p => p.Key.IsPrimaryKey);
            var propertyInfo = key.Value;

            id = Cast(id, propertyInfo.PropertyType);
            propertyInfo.SetValue(dataEntity, id, null);
        }
Пример #6
0
        public IEnumerable <T> SelectMany <T>(Func <T, bool> predicate) where T : DataEntity <T>, new()
        {
            DbTableAttribute table = DataEntity <T> .GetTableAttribute();

            return(this.ExecuteQuery <T>("SELECT * FROM " + table.Name).Where(predicate));
        }
Пример #7
0
        /// <summary>
        /// テーブルの全データを、エンティティのリストで取得します。
        /// </summary>
        /// <typeparam name="T">指定するテーブルのエンティティを指定します。</typeparam>
        /// <returns>エンティティのリストを返却します。</returns>
        public IEnumerable <T> SelectAll <T>() where T : DataEntity <T>, new()
        {
            DbTableAttribute table = DataEntity <T> .GetTableAttribute();

            return(this.ExecuteQuery <T>("SELECT * FROM " + table.Name));
        }