예제 #1
0
 //Select文を実行する(結果を返す)
 public IResults ExecSelect(DbConn aDbConn
                            , string sql
                            , IEnumerable <string> usedTables
                            , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache)
 {
     throw new InvalidOperationException("DbConnオブジェクトの無効な状態遷移が発生しました.");
 }
예제 #2
0
        /// <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()));
        }
예제 #3
0
파일: End.cs 프로젝트: radtek/SqlAccessor
 //論理式を評価する
 public bool ExecExp(DbConn aDbConn
                     , string expression
                     , IEnumerable <string> usedTables
                     , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache)
 {
     aDbConn.GoToError1AndThrow(
         new InvalidOperationException("DbConnオブジェクトの無効な状態遷移が発生しました."));
     return(false);
 }
예제 #4
0
파일: Db.cs 프로젝트: radtek/SqlAccessor
 /// <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));
     }
 }
예제 #5
0
파일: End.cs 프로젝트: radtek/SqlAccessor
 //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);
 }
예제 #6
0
파일: Db.cs 프로젝트: radtek/SqlAccessor
 /// <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));
     }
 }
예제 #7
0
파일: Db.cs 프로젝트: radtek/SqlAccessor
        /// <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));
        }
예제 #8
0
            //論理式を評価する
            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");
                }
            }
예제 #9
0
파일: Db.cs 프로젝트: radtek/SqlAccessor
        /// <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));
        }
예제 #10
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);
     }
 }
예제 #11
0
        //論理式を評価する
        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));
        }
예제 #12
0
        /// <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));
        }
예제 #13
0
 public bool ExecExp(string expression
                     , IEnumerable <string> usedTables
                     , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache)
 {
     return(_dbConn.ExecExp(expression, usedTables, aCacheStrategy));
 }
예제 #14
0
 public IResults ExecSelect(string sql
                            , IEnumerable <string> usedTables
                            , Tran.CacheStrategy aCacheStrategy = Tran.CacheStrategy.UseCache)
 {
     return(_dbConn.ExecSelect(sql, usedTables, aCacheStrategy));
 }