/// <summary> /// 主キーをエンティティから抜いてDBから取得する。なければnullを返す /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dataEntity"></param> /// <returns></returns> public T Select <T>(DataEntity <T> dataEntity) where T : DataEntity <T>, new() { DbTableAttribute attributes = DataEntity <T> .GetTableAttribute(); var keys = DataEntity <T> .GetKeyElements(); if (keys.Count == 0) { throw new ApplicationException("主キーの無いテーブルに選択クエリを発行しようとしました。"); } string sql = @" SELECT * FROM " + attributes.Name + " " + CreateWhereClause <T>(keys, dataEntity); using (IDbConnection connection = this.CreateConnection()) { connection.Open(); using (IDbCommand command = connection.CreateCommand()) { command.CommandTimeout = this.CommandTimeout; command.CommandText = sql; ts.TraceInformation(sql); using (IDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow)) { if (!reader.Read()) { return(default(T)); } return(this.CreateInstance <T>(reader)); } } } }
/// <summary> /// データベースを操作するインスタンスを返す /// </summary> /// <returns></returns> public static Database GetDatabase() { DbTableAttribute table = DataEntity <T> .GetTableAttribute(); var db = table.GetDatabase(); db.CommandTimeout = CommandTimeout; return(db); }
/// <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> /// 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)); }