/// <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); }
/// <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); }
/// <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[])) //{ //} } }
/// <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); }
/// <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); }
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)); }
/// <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)); }