Пример #1
0
        private SqlPod LoadSqlPodFromDll(string sqlPodFileName, string viewName)
        {
            //ファイルの存在有無チェック
            if (!File.Exists(sqlPodFileName))
            {
                return(null);
            }

            SqlPod aSqlPod = null;

            try {
                //SqlPodクラスのサブクラスを定義したアセンブリファイル(dll)をロードする
                Assembly sqlPodAsm = Assembly.LoadFrom(sqlPodFileName);
                //SqlPodの型名からTypeオブジェクトを取得する
                string sqlPodTypeName = this.GetType().Namespace + Type.Delimiter + viewName + "SqlPod";
                Type   sqlPodType     = sqlPodAsm.GetType(sqlPodTypeName);
                //SqlPod aSqlPod = new [sqlPodTypeName]; と同等
                aSqlPod = (SqlPod)Activator.CreateInstance(sqlPodType);
            } catch (Exception ex) {
                //SqlPodクラスが生成できなかった場合、例外を送出する
                throw new BadFormatSqlPodException("SqlPodクラスが生成できませんでした.", ex);
            }

            return(aSqlPod);
        }
Пример #2
0
        public ViewInfo(string viewName
                        , SqlPod aSqlPod
                        , TableInfoSet tableInfoSet
                        , Db aDb)
        {
            _aDb          = aDb;
            _viewName     = viewName;
            _tableInfoSet = tableInfoSet;
            _aSqlPod      = aSqlPod;

            //ViewColumnInfoを取得する
            this.GetAllViewColumnInfo();
        }
Пример #3
0
            public SqlBuilder GetCountSql <TRecord>(IQuery aIQuery)
                where TRecord : class, IRecord, new()
            {
                //aQueryのDownキャスト
                Query <TRecord> aQuery = (Query <TRecord>)aIQuery;
                //TRecord型レコードとViewのマッピング情報を取得する
                RecordViewTableMap <TRecord> aRecordViewMap = _aRecordViewTableMapFactory.CreateRecordViewTableMap <TRecord>();
                //TRecordに対応するSqlPodを生成する
                SqlPod aSqlPod = _aSqlPodFactory.CreateSqlPod <TRecord>();

                //aQueryが持つ条件のプロパティ型リテラル値をDBデータ型に型変換する
                aQuery = aRecordViewMap.CastQuery(aQuery);

                //SQL文を作成する
                RecordViewTableMap <TRecord> aRecordViewTableMap = _aRecordViewTableMapFactory.CreateRecordViewTableMap <TRecord>();

                return(aSqlPod.GetCountSql(aQuery, aRecordViewTableMap));
            }
Пример #4
0
            public SqlBuilder GetSelectSql <TRecord>(Query <TRecord> query
                                                     , LoadMode aLoadMode)
                where TRecord : class, IRecord, new()
            {
                //TRecord型レコードとViewのマッピング情報を取得する
                RecordViewTableMap <TRecord> aRecordViewMap = _aRecordViewTableMapFactory.CreateRecordViewTableMap <TRecord>();
                //TRecordに対応するSqlPodを生成する
                SqlPod aSqlPod = _aSqlPodFactory.CreateSqlPod <TRecord>();

                //aQueryが持つ条件のプロパティ型リテラル値をDBデータ型に型変換する
                query = aRecordViewMap.CastQuery(query);

                //SQL文を作成する
                //引数aLoadModeとaRecordTableMapを追加したのは苦渋の決断
                //(SqlBuilderがテーブルのメタ情報を扱うことを想定していなかったので、後付による拡張が綺麗にならない)
                RecordViewTableMap <TRecord> aRecordViewTableMap = _aRecordViewTableMapFactory.CreateRecordViewTableMap <TRecord>();

                return(aSqlPod.GetSelectSql(query, aRecordViewTableMap));
            }
Пример #5
0
        public SqlPod CreateSqlPod(string viewName)
        {
            //_sqlPodHashへのデータ有無の判断と書込み読込みを不可分処理とする
            //Double-Checked Lockingパターン
            if (!_sqlPodHash.ContainsKey(viewName))
            {
                lock (_sqlPodHash) {
                    if (!_sqlPodHash.ContainsKey(viewName))
                    {
                        //SqlPodを読み込む
                        SqlPod newSqlPod = this.LoadSqlPod(viewName);
                        //DBMS種別を設定する
                        newSqlPod.Dbms = _dbms;
                        //ハッシュに登録する
                        _sqlPodHash.Add(viewName, newSqlPod);
                    }
                }
            }

            return(_sqlPodHash[viewName]);
        }
Пример #6
0
        private SqlPod LoadSqlPod(string viewName)
        {
            SqlPod ret = null;
            //
            //SqlPod.dllの読込み
            //
            //SqlPod.dll及びSqlPodXml.xmlはSqlPodsディレクトリに配置される
            string sqlPodFileName     = System.IO.Path.Combine(_sqlPodDirName, viewName + "SqlPod" + ".dll");
            string sqlPodXmlFileName  = System.IO.Path.Combine(_sqlPodDirName, viewName + ".sql");
            string sqlPodXmlFileName2 = System.IO.Path.Combine(_sqlPodDirName, viewName + "SqlPodXml" + ".xml");

            //SqlPod.dllからSqlPodオブジェクトを生成する
            ret = this.LoadSqlPodFromDll(sqlPodFileName, viewName);
            if (ret == null)
            {
                //SqlPod.dllが無い場合は.sqlを読み込む
                ret = this.LoadSqlPodFromXml(sqlPodXmlFileName);
                if (ret == null)
                {
                    //SqlPod.dll及び.sqlが無い場合はSqlPodXml.xmlを読み込む
                    ret = this.LoadSqlPodFromXml(sqlPodXmlFileName2);
                    if (viewName == "ColumnInfo" && ret == null)
                    {
                        //SqlPod.dll及び.sql.xmlがない場合でレコードがColumnInfoの場合
                        //ColumnInfoSqlPodを返す
                        ret = new ColumnInfoSqlPod();
                    }
                }
            }

            //SqlPod.dll及び.sql及びSqlPodXml.xmlが存在しない場合は例外を再送出する
            if (ret == null)
            {
                throw new FileNotFoundException(
                          "レコード\"" + viewName + "\"のSqlPod.dll及びSqlPodXml.xmlが見つかりませんでした", sqlPodXmlFileName);
            }

            return(ret);
        }