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); }
public ViewInfo(string viewName , SqlPod aSqlPod , TableInfoSet tableInfoSet , Db aDb) { _aDb = aDb; _viewName = viewName; _tableInfoSet = tableInfoSet; _aSqlPod = aSqlPod; //ViewColumnInfoを取得する this.GetAllViewColumnInfo(); }
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)); }
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)); }
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]); }
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); }