//Select文を実行する(結果を返す) public IResults ExecSelect(DbConn aDbConn, string sql , IEnumerable <string> usedTables , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache) { //キャッシュが利用可能か判定する IResults aResults = null; if (aCacheStrategy == Tran.CacheStrategy.UseCache || aCacheStrategy == Tran.CacheStrategy.UseCacheIfExists) { aResults = aDbConn._aResultsCache.Find(sql, usedTables); } //キャッシュが利用できない場合、DBに接続してトランザクションを開始する try { if (aResults == null) { //DBに接続する aDbConn.Open(); //トランザクションを開始する aDbConn.BeginTran(); } } catch (Exception ex) { //Error1状態に遷移して例外を再送出する aDbConn.GoToError1AndThrow(ex); } try { if (aCacheStrategy == Tran.CacheStrategy.UseCache) { if (aResults == null) { //キャッシュの追加 try { aDbConn._aResultsCache.AcquireReaderLock(); //SELECT結果の取得からキャッシュへの格納までを排他制御する aResults = aDbConn._aResultsCache.AddAndFind(sql, usedTables, aDbConn.CreateCachedResults(sql)); } finally { aDbConn._aResultsCache.ReleaseReaderLock(); } //次の状態に遷移する aDbConn.GoToNextState(Transaction.GetInstance()); } return(aResults); } else if (aCacheStrategy == Tran.CacheStrategy.UseCacheIfExists) { if (aResults == null) { //SELECT文を発行する aResults = aDbConn.CreateResults(sql); //次の状態に遷移する aDbConn.GoToNextState(Transaction.GetInstance()); } return(aResults); } else if (aCacheStrategy == Tran.CacheStrategy.NoCache) { //SELECT文を発行する aResults = aDbConn.CreateResults(sql); //次の状態に遷移する aDbConn.GoToNextState(Transaction.GetInstance()); //抽出結果を返す return(aResults); } else { throw new ArgumentOutOfRangeException("aCacheStrategy", "Tran.CacheStrategy型の予期しない値です"); } } catch (Exception ex) { //Error1状態に遷移して例外を再送出する aDbConn.GoToError1AndThrow(ex, true); //Warning対策 return(null); } }