Beispiel #1
0
        /// <summary>
        /// connStrで指定された接続文字列でデータベースに接続できるか判定する
        /// </summary>
        /// <param name="dbms">DBMSの種別</param>
        /// <param name="connStr">接続文字列</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static bool IsConnectable(SqlBuilder.DbmsType dbms
                                         , string connStr)
        {
            bool   ret     = false;
            Db     aDb     = null;
            DbConn aDbConn = null;

            try {
                aDb     = new Db(dbms, connStr);
                aDbConn = aDb.CreateDbConn();
                aDbConn.Dispose();
                aDb.Dispose();
                //接続、及び切断ができたら接続可と判定する
                ret = true;
            } catch (Exception ex) {
                //接続、又は切断時に例外が発生したら接続不可と判定する
                ret = false;
            } finally {
                if (aDbConn != null)
                {
                    aDbConn.Dispose();
                }
                if (aDb != null)
                {
                    aDb.Dispose();
                }
            }

            return(ret);
        }
 public SqlPodDefinedByXml(string sqlPodXml, SqlBuilder.DbmsType dbms)
 {
     _sqlPodXml     = sqlPodXml;
     _dbms          = dbms;
     _lastWriteTime = File.GetLastWriteTime(sqlPodXml);
     this.LoadSqlPodXml();
 }
Beispiel #3
0
 public SqlBuilders(string sqlsStr
                    , SqlBuilder.DbmsType dbmsType = SqlBuilder.DbmsType.Unknown
                    , bool forSqlAccessor          = true)
     : this(MiniSqlParserAST.CreateStmts(sqlsStr
                                         , SqlBuilder.ConvertDbmsType(dbmsType)
                                         , forSqlAccessor))
 {
 }
Beispiel #4
0
        private bool RegistColumnInfo(SqlBuilder.DbmsType dbms, string tableName)
        {
            //引数で指定された名称のテーブルが存在すれば(カラムのメタ情報が1件以上存在すれば)True
            bool tableExists = false;

            Query <ColumnInfo>          aQuery        = new Query <ColumnInfo>();
            Dictionary <string, string> aPlaceHolders = new Dictionary <string, string>();

            if (dbms == SqlBuilder.DbmsType.Sqlite)
            {
                //For SQLite
                aPlaceHolders.Add("SQLite_TableName_", tableName);
            }
            else
            {
                aQuery.And(val.of("TableName") == tableName);
            }

            using (Tran aTran = _aDb.CreateTranWithoutLock()) {
                //テーブルの全てのカラムのメタ情報を取得し、_columnInfoHashに格納する
                Reader <ColumnInfo> reader = aTran.Find(aQuery
                                                        , aPlaceHolders
                                                        , Tran.LoadMode.ReadOnly
                                                        , Tran.CacheStrategy.NoCache);
                foreach (ColumnInfo aColumnInfo in reader)
                {
                    //SQLiteのPRAGMA TABLE_INFO()の結果にテーブル名が含まれないので、ここで補う
                    if (dbms == SqlBuilder.DbmsType.Sqlite)
                    {
                        aColumnInfo.TableName = tableName;
                    }

                    _columnInfoHash.Add(aColumnInfo.ColumnName, aColumnInfo);
                    //主キーカラムの場合は_primaryKeysにも登録する
                    if (aColumnInfo.PrimaryKey.HasValue && aColumnInfo.PrimaryKey.Value)
                    {
                        _primaryKeys.Add(aColumnInfo);
                    }
                    tableExists = true;
                }
            }

            //主キーカラムのないテーブルは、全てのカラムが主キーと見做す
            if (tableExists && _primaryKeys.Count == 0)
            {
                _primaryKeys.AddRange(_columnInfoHash.Values);
            }

            return(tableExists);
        }
Beispiel #5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="splPodsPath">SqlPodsディレクトリのファイルパス
        /// (SqlAccessor.dllを基準とした相対パス指定)</param>
        /// <param name="dbms">DBMS種別</param>
        /// <remarks></remarks>
        public SqlPodFactory(string splPodsPath, SqlBuilder.DbmsType dbms)
        {
            //DBMS種別の設定
            _dbms = dbms;

            //SqlPodsディレクトリは、自アセンブリファイルと同じディレクトリに配置される
            //注意!) C:\\はC:\と同じファイルパスではない。C:\\はネットワーク先のファイルパスを意味するらしい
            _sqlPodDirName = System.IO.Path.Combine(
                new System.IO.FileInfo(
                    new Uri(this.GetType().Assembly.CodeBase).LocalPath
                    ).DirectoryName
                , splPodsPath
                );
        }
Beispiel #6
0
 public RecordReaderImp(IResults aResults
                        , ViewInfo aViewInfo
                        , ICaster aCaster
                        , SqlBuilder.DbmsType aDbms
                        , Tran aTran)
 {
     _aResults  = aResults;
     _aViewInfo = aViewInfo;
     _aCaster   = aCaster;
     _aDbms     = aDbms;
     _aTran     = aTran;
     //レコードのメタ情報の取得
     System.Type recordType = (new TRecord()).GetType();
     _recordName = recordType.Name;
     _properties = recordType.GetProperties();
 }
Beispiel #7
0
        /// <summary>
        /// データベースに接続する
        /// </summary>
        /// <param name="dbms">DBMSの種別</param>
        /// <param name="connStr">接続文字列</param>
        /// <param name="dbParams">設定情報</param>
        public Db(SqlBuilder.DbmsType dbms
                  , string connStr
                  , DbParameters dbParams = null)
        {
            _dbms = dbms;

            _connStr = connStr;
            if (dbParams == null)
            {
                _params = new DbParameters();
            }
            else
            {
                _params = (DbParameters)dbParams.Clone();
            }

            //プールするDB接続を用意する
            _connections = new List <DbConn>();
            for (int i = 0; i <= _params.ConnectionPool; i++)
            {
                _connections.Add(this.CreateDbConn());
            }

            //キャッシュテーブルの作成
            if (_params.Cache == DbParameters.CacheType.Null)
            {
                _aResultsCache = new NullResultsCache();
            }
            else if (_params.Cache == DbParameters.CacheType.LRU)
            {
                _aResultsCache = new LruResultsCache(_params.CacheSize);
            }
            else if (_params.Cache == DbParameters.CacheType.MarkovLRU)
            {
                _aResultsCache = new MarkovResultsCache(
                    new LruResultsCache(_params.CacheSize),
                    this);
            }
            else
            {
                throw new InvalidEnumArgumentException("Undefined CacheType is used");
            }

            //キャスターの生成
            _aCaster = this.CreateCaster();
            //SqlPodファクトリの生成
            _aSqlPodFactory = new SqlPodFactory(_params.SqlPodsDir, _dbms);
            //テーブル情報の生成
            _aTableInfoSet = new TableInfoSet(this);
            //レコードとテーブルのマッピング情報の生成
            _aRecordViewTableMapFactory = new RecordViewTableMapFactory(this);

            //ロックマネージャの生成
            //SQLiteの場合は、必ずSqliteLockManagerを使うこと
            if (_dbms == SqlBuilder.DbmsType.Sqlite)
            {
                _aLockManager = new SqliteLockManager();
            }
            else if (_params.LockData == DbParameters.LockDataType.Memory)
            {
                _aLockManager = new MemLockManager(_aRecordViewTableMapFactory, _aCaster);
            }
            else if (_params.LockData == DbParameters.LockDataType.Db)
            {
                _aLockManager = new DbLockManager(_aRecordViewTableMapFactory, this);
            }
            else if (_params.LockData == DbParameters.LockDataType.Sqlite)
            {
                _aLockManager = new SqliteLockManager();
            }
            else if (_params.LockData == DbParameters.LockDataType.Null)
            {
                _aLockManager = new NullLockManager();
            }
            else
            {
                throw new InvalidEnumArgumentException("Undefined LockDataType is used");
            }

            //SQL文発行ログの出力メソッドの作成
            if (_params.Logger == DbParameters.LoggerType.Null)
            {
                _aLogger = new NullLogger();
            }
            else if (_params.Logger == DbParameters.LoggerType.WindowsEventLog)
            {
                _aLogger = new WindowsEventLogger();
            }
            else if (_params.Logger == DbParameters.LoggerType.Console)
            {
                _aLogger = new ConsoleLogger();
            }
            else
            {
                throw new InvalidEnumArgumentException("Undefined LoggerType is used");
            }
        }