//Select文を実行する(結果を返す) public IResults ExecSelect(DbConn aDbConn , string sql , IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { throw new InvalidOperationException("DbConnオブジェクトの無効な状態遷移が発生しました."); }
/// <summary> /// IF文を判定し、条件がTrueになる入れ子SQL文を返す /// </summary> /// <param name="aDbConn">Db接続</param> /// <param name="ifSql">IF文</param> /// <param name="placeHolders">IF文の条件式に適用するPlaceHolder</param> /// <param name="aCacheStrategy"></param> /// <returns></returns> /// <remarks>条件がTrueになる入れ子SQL文がない場合、最大の表記順番+1を返す</remarks> public static SqlAndSeq Evaluate(IDbConn aDbConn , SqlBuilder ifSql , PlaceHolders placeHolders , Tran.CacheStrategy aCacheStrategy) { //IF文でない場合は渡されたSQLをそのまま返す if (ifSql.GetStatementType() != SqlBuilder.StatementType.If) { return(new SqlAndSeq(0, new SqlBuilders(new SqlBuilder[] { ifSql }))); } int i = 0; foreach (Tuple <SqlPredicate, SqlBuilders> branch in ifSql.GetIfBranches()) { //IF文の条件式にPlaceHolderを適用する branch.Item1.Place(placeHolders.ToDictionary()); string ifCondition = branch.Item1.ToString(); if (IfStatement.EvaluateCondition(aDbConn, ifCondition, aCacheStrategy)) { return(new SqlAndSeq(i, branch.Item2)); } i += 1; } return(new SqlAndSeq(i, new SqlBuilders())); }
//論理式を評価する public bool ExecExp(DbConn aDbConn , string expression , IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { aDbConn.GoToError1AndThrow( new InvalidOperationException("DbConnオブジェクトの無効な状態遷移が発生しました.")); return(false); }
/// <summary> /// データベースからレコードを1件取得する /// </summary> /// <typeparam name="TRecord"></typeparam> /// <param name="aQuery">Queryオブジェクト</param> /// <param name="aLoadMode">読込モード</param> /// <param name="aCacheStrategy">キャッシュ動作方式</param> /// <returns>取得したレコード</returns> /// <remarks>指定された抽出条件で2件以上のレコードが該当した場合は、例外を送出する</remarks> public TRecord FindOne <TRecord>(Query <TRecord> aQuery , Tran.LoadMode aLoadMode = Tran.LoadMode.ReadOnly , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) where TRecord : class, IRecord, new() { using (Tran aTran = this.CreateTran()) { return(aTran.FindOne <TRecord>(aQuery, null, aLoadMode, aCacheStrategy)); } }
//Select文を実行する(結果を返す) public IResults ExecSelect(DbConn aDbConn , string sql , IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { aDbConn.GoToError1AndThrow( new InvalidOperationException("DbConnオブジェクトの無効な状態遷移が発生しました.")); //Warning対策 return(null); }
/// <summary> /// データベースからレコードを1件取得する /// </summary> /// <typeparam name="TRecord"></typeparam> /// <param name="aQuery">Queryオブジェクト</param> /// <param name="aPlaceHolders">プレースホルダ</param> /// <param name="aLoadMode">読込モード</param> /// <param name="aCacheStrategy">キャッシュ動作方式</param> /// <returns>取得したレコード</returns> /// <remarks>指定された抽出条件で2件以上のレコードが該当した場合は、例外を送出する</remarks> public TRecord FindOne <TRecord>(Query <TRecord> aQuery , Dictionary <string, string> aPlaceHolders , Tran.LoadMode aLoadMode = Tran.LoadMode.ReadOnly , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) where TRecord : class, IRecord, new() { using (Tran aTran = this.CreateTran()) { return(aTran.FindOne <TRecord>(aQuery, aPlaceHolders, aLoadMode, aCacheStrategy)); } }
/// <summary> /// データベースからレコードを取得する /// </summary> /// <typeparam name="TRecord"></typeparam> /// <param name="aIQuery">Queryオブジェクト</param> /// <param name="aLoadMode">読込モード</param> /// <param name="aCacheStrategy">キャッシュ動作方式</param> /// <returns>取得したレコードのコレクション</returns> /// <remarks>aQueryがQuery(Of TRecord)型でないのは、 /// オーバーロード解決時に、ジェネリックパラメータの制約が無視される為</remarks> public IRecordReader <TRecord> Find <TRecord>(Query <TRecord> aIQuery , Tran.LoadMode aLoadMode = Tran.LoadMode.ReadOnly , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) where TRecord : class, IRecord, new() { //トランザクションの開始 Tran aTran = this.CreateTran(); //イテレート終了時にトランザクションを終了するRecordReaderを返す return(new CommitAtEndRecordReader <TRecord>(aTran.Find <TRecord>(aIQuery, null, aLoadMode, aCacheStrategy), aTran)); }
//論理式を評価する public bool ExecExp(DbConn aDbConn , string expression, IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { //式評価用SELECT文を作成する string sql = aDbConn.MakeExpEvalSql(expression); //トランザクション、状態遷移、エラー処理は、ExecSelect()で処理される using (IResults aResults = this.ExecSelect(aDbConn, sql, usedTables, aCacheStrategy)) { return(aResults.MoveNext() && aResults.GetValueOf(0).ToString() == "1"); } }
/// <summary> /// データベースからレコードを取得する /// </summary> /// <typeparam name="TRecord"></typeparam> /// <param name="criteriaRec">抽出条件を格納したレコード</param> /// <param name="aPlaceHolders">プレースホルダ</param> /// <param name="aLoadMode">読込モード</param> /// <param name="aCacheStrategy">キャッシュ動作方式</param> /// <returns>取得したレコードのコレクション</returns> /// <remarks></remarks> /// public IRecordReader <TRecord> Find <TRecord>(TRecord criteriaRec , Dictionary <string, string> aPlaceHolders , Tran.LoadMode aLoadMode = Tran.LoadMode.ReadOnly , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) where TRecord : class, IRecord, new() { //トランザクションの開始 Tran aTran = this.CreateTran(); //イテレート終了時にトランザクションを終了するRecordReaderを返す return(new CommitAtEndRecordReader <TRecord>(aTran.Find(criteriaRec, aPlaceHolders, aLoadMode, aCacheStrategy), aTran)); }
//Select文を実行する(結果を返す) public IResults ExecSelect(DbConn aDbConn , string sql , IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { try { if (aCacheStrategy == Tran.CacheStrategy.UseCache) { //キャッシュが利用可能か判定する IResults aResults = aDbConn._aResultsCache.Find(sql, usedTables); if (aResults == null) { //キャッシュの追加 try { aDbConn._aResultsCache.AcquireReaderLock(); //SELECT結果の取得からキャッシュへの格納までを排他制御する aResults = aDbConn._aResultsCache.AddAndFind(sql, usedTables, aDbConn.CreateCachedResults(sql)); } finally { aDbConn._aResultsCache.ReleaseReaderLock(); } } return(aResults); } else if (aCacheStrategy == Tran.CacheStrategy.UseCacheIfExists) { //キャッシュが利用可能か判定する IResults aResults = aDbConn._aResultsCache.Find(sql, usedTables); if (aResults == null) { //SELECT文を発行する aResults = aDbConn.CreateResults(sql); } return(aResults); } else if (aCacheStrategy == Tran.CacheStrategy.NoCache) { //SELECT文を発行する IResults aResults = aDbConn.CreateResults(sql); //抽出結果を返す return(aResults); } else { throw new ArgumentOutOfRangeException("aCacheStrategy", "Tran.CacheStrategy型の予期しない値です"); } } catch (Exception ex) { //Error1状態に遷移して例外を再送出する aDbConn.GoToError1AndThrow(ex, true); //Warning対策 return(null); } }
//論理式を評価する public bool ExecExp(string expression , IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { //自身のTransaction内で更新したテーブルのキャッシュは //更新前の結果なので参照しないようにする if (aCacheStrategy != Tran.CacheStrategy.NoCache && !_aResultsCache.IsNullCache && this.UpdatedTablesContains(usedTables)) { aCacheStrategy = Tran.CacheStrategy.NoCache; } return(_state.ExecExp(this, expression, usedTables, aCacheStrategy)); }
/// <summary> /// 条件式の判定結果を返す /// </summary> /// <param name="aDbConn"></param> /// <param name="ifCondition"></param> /// <param name="aCacheStrategy"></param> /// <returns></returns> /// <remarks></remarks> public static bool EvaluateCondition(IDbConn aDbConn , string ifCondition , Tran.CacheStrategy aCacheStrategy) { if (string.IsNullOrEmpty(ifCondition)) { throw new System.ArgumentNullException("ifCondition", "指定された条件式が空です"); } //参照テーブル名を取得するため、ここで仮のSQL文を作成する SqlBuilder conditionSql = new SqlBuilder("SELECT 1 WHERE " + ifCondition); HashSet <string> usedTableNames = conditionSql.GetAllTableNames(); //ダミーテーブルTを除外する //usedTableNames.Remove(conditionSql.GetSrcTableNames()) return(aDbConn.ExecExp(ifCondition, usedTableNames, aCacheStrategy)); }
public bool ExecExp(string expression , IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { return(_dbConn.ExecExp(expression, usedTables, aCacheStrategy)); }
public IResults ExecSelect(string sql , IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { return(_dbConn.ExecSelect(sql, usedTables, aCacheStrategy)); }