예제 #1
0
 //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);
     }
 }