Exemple #1
0
 public virtual object BeforeCast(BooleanViewColumnType viewColumnType
                                  , PropertyType propertyType
                                  , ViewColumnInfo aViewColumnInfo
                                  , object viewColumnValue)
 {
     return(viewColumnValue);
 }
Exemple #2
0
        public string CastToSqlLiteralType(object propertyValue
                                           , ViewColumnInfo aViewColumnInfo
                                           , ColumnInfo aColumnInfo = null)
        {
            //プロパティの取得元SELECT句のデータ型から、対応するSQLリテラル型を決める
            SqlLiteralType sqlLiteralType = _dataTypeMapper.GetSqlLiteralTypeOf(aViewColumnInfo);

            //propertyTypeを生成する
            PropertyType aPropertyType = null;

            //propertyValueがnullまたはNULL表現値の場合、"NULL", "DEFAULT", SQLリテラル初期値のいずれかを返す
            if (propertyValue == null)
            {
                //null、またはNull許容型にnullが格納された値の場合
                return(this.NullOrDefaultValue(sqlLiteralType, aColumnInfo));
            }
            else
            {
                aPropertyType = this.GetPropertyType(propertyValue.GetType());
                if (aPropertyType.IsNullValue(propertyValue))
                {
                    return(this.NullOrDefaultValue(sqlLiteralType, aColumnInfo));
                }
            }

            //プロパティ型から、SQLリテラル型にキャスト処理を行う
            return(sqlLiteralType.CastFrom(aPropertyType, aColumnInfo, propertyValue));
        }
Exemple #3
0
 public virtual object AfterCast(BooleanViewColumnType viewColumnType
                                 , PropertyType propertyType
                                 , ViewColumnInfo aViewColumnInfo
                                 , object propertyValue)
 {
     return(propertyValue);
 }
        internal override object CastTo(PropertyType propertyType
                                        , ViewColumnInfo aViewColumnInfo
                                        , object viewColumnValue)
        {
            object value = _castEditor.BeforeCast_ViewColumnType(this, aViewColumnInfo, viewColumnValue);

            value = propertyType.CastFrom(this, aViewColumnInfo, value);
            return(_castEditor.AfterCast_ViewColumnType(this, aViewColumnInfo, value));
        }
Exemple #5
0
        internal object CastFrom(BooleanViewColumnType viewColumnType
                                 , ViewColumnInfo aViewColumnInfo
                                 , object viewColumnValue)
        {
            object value = this.BeforeCast_PropertyType(aViewColumnInfo, viewColumnValue);

            value = this.BeforeCast(viewColumnType, aViewColumnInfo, value);
            value = this.CastFromImp(viewColumnType, value);
            value = this.AfterCast(viewColumnType, aViewColumnInfo, value);
            return(this.AfterCast_PropertyType(aViewColumnInfo, value));
        }
        internal override object CastTo(PropertyType propertyType
                                        , ViewColumnInfo aViewColumnInfo
                                        , object viewColumnValue)
        {
            //ADO.NETが返した値を、Cast前編集する
            object value = _castEditor.BeforeCast_ViewColumnType(this, aViewColumnInfo, viewColumnValue);

            //ADO.NETが返したデータ型から、プロパティ型にキャストする
            value = propertyType.CastFrom(this, aViewColumnInfo, value);
            //プロパティ値をCast後編集する
            return(_castEditor.AfterCast_ViewColumnType(this, aViewColumnInfo, value));
        }
Exemple #7
0
        private void GetAllViewColumnInfo()
        {
            //SqlPodから初期化用SELECT文を取得する
            SqlBuilder sql = _aSqlPod.GetInitSelectSql();

            //SELECT文から全てのSELECT項目を取得する
            List <string> selectItems = null;

            if (sql.HasWildcard() || sql.HasTableWildcard())
            {
                //全ての抽出元テーブルの全ての列名をallSrcTableColumnsに格納する
                var allSrcTableColumns = new Dictionary <string, IEnumerable <Tuple <string, bool> > >();
                foreach (string srcTableName in sql.GetSrcTableNames())
                {
                    List <Tuple <string, bool> > listOfTableColumn = new List <Tuple <string, bool> >();
                    foreach (ColumnInfo columnInfo in _tableInfoSet[srcTableName].GetAllColumns())
                    {
                        listOfTableColumn.Add(Tuple.Create(columnInfo.ColumnName
                                                           , columnInfo.PrimaryKey.HasValue && columnInfo.PrimaryKey.Value));
                    }
                    allSrcTableColumns.Add(srcTableName, listOfTableColumn);
                }
                //メインクエリのSELECT句にワイルドカードが存在する場合
                selectItems = sql.GetSelectItems(allSrcTableColumns);
            }
            else
            {
                //存在しない場合
                //(こちらの方が処理は速い)
                selectItems = sql.GetSelectItems();
            }

            int i = 0;

            foreach (string selectItem in selectItems)
            {
                //名称の一致は大文字小文字を区別すべきである!
                if (_viewColumnInfoDic.ContainsKey(selectItem.ToUpper()))
                {
                    //同一名称のSELECT句が存在する場合、先に定義されたSELECT句のみを採用する
                    i += 1;
                    continue;
                }
                var aViewColumnInfo = new ViewColumnInfo(this, _viewName, selectItem, i);
                _viewColumnInfoDic.Add(selectItem.ToUpper(), aViewColumnInfo);
                i += 1;
            }

            if (sql.HasWildcard())
            {
                return;
            }
        }
Exemple #8
0
        private object AfterCast_PropertyType(ViewColumnInfo aViewColumnInfo
                                              , object propertyValue)
        {
            MethodInfo methodInfo = _castEditorType.GetMethod("AfterCast_PropertyType",
                                                              new System.Type[] { this.GetType(),
                                                                                  aViewColumnInfo.GetType(),
                                                                                  typeof(object) });

            return(methodInfo.Invoke(_castEditor,
                                     new object[] { this,
                                                    aViewColumnInfo,
                                                    propertyValue }));
        }
Exemple #9
0
        public object CastToPropertyType(object value, System.Type propertyTypeObj)
        {
            if (value == null)
            {
                throw new InvalidColumnToPropertyCastException("変換前の値がNullです");
            }

            //ダミーのViewColumnInfoを用いる
            ViewColumnInfo aViewColumnInfo = new ViewColumnInfo(null, "", "", 0);

            aViewColumnInfo.SetTypeInfo(value.GetType(), "");

            return(this.CastToPropertyType(value, aViewColumnInfo, propertyTypeObj));
        }
Exemple #10
0
        internal object CastFrom(StringViewColumnType viewColumnType
                                 , ViewColumnInfo aViewColumnInfo
                                 , object viewColumnValue)
        {
            //ADO.NETが返した値を、Cast前編集する
            object value = this.BeforeCast_PropertyType(aViewColumnInfo, viewColumnValue);

            //ADO.NETが返した値を、Cast前編集する
            value = this.BeforeCast(viewColumnType, aViewColumnInfo, value);
            //ADO.NETが返したデータ型から、プロパティ型にキャストする
            value = this.CastFromImp(viewColumnType, value);
            //プロパティ値を、Cast後編集する
            value = this.AfterCast(viewColumnType, aViewColumnInfo, value);
            //プロパティ値を、Cast後編集する
            return(this.AfterCast_PropertyType(aViewColumnInfo, value));
        }
        public SqlLiteralType GetSqlLiteralTypeOf(ViewColumnInfo aViewColumnInfo)
        {
            if (aViewColumnInfo == null ||
                aViewColumnInfo.HostDataType == null)
            {
                throw new InvalidPropertyToColumnCastException(
                          "ADO.NETが返したデータ型が分からないため、プロパティ値をSQLリテラル型に変換できませんでした");
            }

            //ADO.NETが返すデータ型の完全修飾名
            string typeName = aViewColumnInfo.HostDataType.FullName;

            if (typeName == "System.String" ||
                typeName == "System.Char[]")
            {
                return(new StringSqlLiteralType(_castEditor));
            }
            else if (typeName == "System.Byte" ||
                     typeName == "System.Int16" ||
                     typeName == "System.Int32" ||
                     typeName == "System.Int64" ||
                     typeName == "System.Decimal")
            {
                return(new NumberSqlLiteralType(_castEditor));
            }
            else if (typeName == "System.DateTime")
            {
                return(new OracleDateTimeSqlLiteralType(_castEditor));
            }
            else if (typeName == "System.Single" ||
                     typeName == "System.Double")
            {
                return(new DoubleSqlLiteralType(_castEditor));
            }
            else if (typeName == "System.TimeSpan")
            {
                //Int64で返るデータ型は、Oracleネイティブデータ型では、NUMBER型とINTERVAL YEAR TO MONTH型の2つの可能性があるが、
                //Int64はNumber型に対応付けている。そのため、INTERVAL YEAR TO MONTH型に対するSQLリテラル型はNumber型になる。
                return(new IntervalSqlLiteralType(_castEditor));
            }
            else
            {
                throw new InvalidPropertyToColumnCastException(
                          "ADO.NETが未定義なデータ型を返したため、プロパティ値をSQLリテラル型に変換できませんでした");
            }
        }
Exemple #12
0
        internal SqlLiteral CreateSqlLiteral(ICaster caster
                                             , IViewInfoGetter viewInfoGetter
                                             , val val
                                             , object literal)
        {
            string         propertyName   = val.PropertyName;
            ViewColumnInfo viewColumnInfo = viewInfoGetter.GetViewColumnInfo(propertyName);

            if (viewColumnInfo == null)
            {
                throw new NotExistsViewColumnException(
                          propertyName + "はレコード" + viewInfoGetter.GetViewInfo().Name +
                          "に存在しない、" + "またはSELECT句と紐付いていません");
            }
            string sqlLiteral = caster.CastToSqlLiteralType(literal, viewColumnInfo);

            return(new SqlLiteral(sqlLiteral));
        }
Exemple #13
0
 private object BeforeCast(ViewColumnType viewColumnType
                           , ViewColumnInfo aViewColumnInfo
                           , object viewColumnValue)
 {
     try {
         MethodInfo methodInfo = _castEditorType.GetMethod("BeforeCast",
                                                           new System.Type[] { viewColumnType.GetType(),
                                                                               this.GetType(),
                                                                               aViewColumnInfo.GetType(),
                                                                               typeof(object) });
         return(methodInfo.Invoke(_castEditor,
                                  new object[] { viewColumnType,
                                                 this,
                                                 aViewColumnInfo,
                                                 viewColumnValue }));
     } catch (System.Exception ex) {
         MethodInfo[] m = _castEditorType.GetMethods();
         throw;
     }
 }
Exemple #14
0
        public object CastToPropertyType(object viewColumnValue
                                         , ViewColumnInfo aViewColumnInfo
                                         , System.Type propertyTypeObj
                                         , ColumnInfo aColumnInfo = null)
        {
            //columnValueがnullまたはDbNullの場合、NULL表現値を返す
            if (viewColumnValue == null || viewColumnValue is DBNull)
            {
                if (this.IsNullableType(propertyTypeObj))
                {
                    //変換先プロパティ型がNull許容型ならば、nullがNull表現値である
                    return(null);
                }
                else
                {
                    //Null許容型でないならば、データ型固有のNull表現値を返す
                    return(this.GetPropertyType(propertyTypeObj).GetNullValue());
                }
            }

            //変換先プロパティがNull許容型ならば、Null許容型が含むジェネリックパラメータ型に
            //対応するPropertyTypeを取得する
            PropertyType aPropertyType = null;

            if (this.IsNullableType(propertyTypeObj))
            {
                aPropertyType = this.GetPropertyType(this.GetGenericParameterType(propertyTypeObj));
            }
            else
            {
                aPropertyType = this.GetPropertyType(propertyTypeObj);
            }

            //ViewColumnTypeを生成する
            ViewColumnType viewColumnType = this.GetViewColumnType(aViewColumnInfo);

            //ADO.NETが返したデータ型から、プロパティ型にキャスト処理を行う
            return(viewColumnType.CastTo(aPropertyType, aViewColumnInfo, viewColumnValue));
        }
Exemple #15
0
 internal abstract object CastTo(PropertyType propertyType
                                 , ViewColumnInfo aViewColumnInfo
                                 , object viewColumnValue);
Exemple #16
0
        public SqlLiteralType GetSqlLiteralTypeOf(ViewColumnInfo aViewColumnInfo)
        {
            if (aViewColumnInfo == null)
            {
                throw new ArgumentNullException("aViewColumnInfo", "aViewColumnInfoがnullです");
            }
            if (aViewColumnInfo.DbColumnTypeName == null)
            {
                throw new ApplicationException(
                          aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                          "に対応するSQL Serverのデータ型が分からないため、プロパティ値をSQLリテラル型に変換できませんでした");
            }

            //ADO.NETが返すSQL Serverのデータ型名
            string typeName = aViewColumnInfo.DbColumnTypeName;

            if (typeName == "nvarchar" ||
                typeName == "ntext" ||
                typeName == "nchar")
            {
                return(new StringSqlLiteralType(_castEditor, true));
            }
            else if (typeName == "varchar" ||
                     typeName == "text" ||
                     typeName == "char")
            {
                return(new StringSqlLiteralType(_castEditor, false));
            }
            else if (typeName == "int" ||
                     typeName == "numeric" ||
                     typeName == "decimal" ||
                     typeName == "bit" ||
                     typeName == "money" ||
                     typeName == "uniqueidentifier" ||
                     typeName == "bigint" ||
                     typeName == "tinyint" ||
                     typeName == "smallint" ||
                     typeName == "smallmoney")
            {
                return(new NumberSqlLiteralType(_castEditor));
            }
            else if (typeName == "date" ||
                     typeName == "datetime2" ||
                     typeName == "timestamp" ||
                     typeName == "rowversion" ||
                     typeName == "datetime" ||
                     typeName == "smalldatetime")
            {
                return(new DateTimeSqlLiteralType(_castEditor));
            }
            else if (typeName == "real" ||
                     typeName == "float")
            {
                return(new DoubleSqlLiteralType(_castEditor));
            }
            else if (typeName == "datetimeoffset" ||
                     typeName == "time")
            {
                return(new IntervalSqlLiteralType(_castEditor));
            }
            else if (typeName == "binary" ||
                     typeName == "FILESTREAM attribute " ||
                     typeName == "image" ||
                     typeName == "sql_variant" ||
                     typeName == "varbinary" ||
                     typeName == "xml")
            {
                throw new InvalidPropertyToColumnCastException(
                          aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                          "に対応するSQL Serverのデータ型 " + typeName + "はSQLリテラル型に変換できません");
            }
            else
            {
                throw new ApplicationException(
                          aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                          "に対応するSQL Serverのデータ型が未定義なため、プロパティ値をSQLリテラル型に変換できませんでした");
            }
        }
Exemple #17
0
        public SqlLiteralType GetSqlLiteralTypeOf(ViewColumnInfo aViewColumnInfo)
        {
            if (aViewColumnInfo == null)
            {
                throw new ArgumentNullException("aViewColumnInfo", "aViewColumnInfoがnullです");
            }
            if (aViewColumnInfo.DbColumnTypeName == null)
            {
                throw new ApplicationException(
                          aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                          "に対応するSQLiteのデータ型が分からないため、プロパティ値をSQLリテラル型に変換できませんでした");
            }

            //ADO.NETが返すPervasiveのデータ型名
            string typeName = aViewColumnInfo.DbColumnTypeName.ToUpper();

            //
            // http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
            //
            if (typeName.Contains("INT"))
            {
                //1. If the declared type contains the string "INT" then it is assigned INTEGER affinity.
                return(new NumberSqlLiteralType(_castEditor));
            }
            else if (typeName.Contains("TEXT") ||
                     typeName.Contains("CHAR") ||
                     typeName.Contains("CLOB"))
            {
                //2. If the declared type of the column contains any of the strings "CHAR",
                //   "CLOB", or "TEXT" then that column has TEXT affinity.
                return(new StringSqlLiteralType(_castEditor));
            }
            else if (typeName.Contains("BLOB"))
            {
                //3. If the declared type for a column contains the string "BLOB" or
                //   if no type is specified then the column has affinity NONE.
                throw new ApplicationException(aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                                               "に対応するSQLiteのデータ型が未定義なため、プロパティ値をSQLリテラル型に変換できませんでした");
            }
            else if (typeName == "")
            {
                // expressions do no necessarily have an affinity.
                var sqlLiteralType = this.GetSqlLiteralTypeOf(aViewColumnInfo.HostDataType);
                if (sqlLiteralType == null)
                {
                    throw new ApplicationException(aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                                                   "に対応するSQLiteのデータ型が未定義なため、プロパティ値をSQLリテラル型に変換できませんでした.");
                }
                return(sqlLiteralType);
            }
            else if (typeName.Contains("REAL") ||
                     typeName.Contains("FLOA") ||
                     typeName.Contains("DOUB"))
            {
                //4. If the declared type for a column contains any of the strings "REAL",
                //   "FLOA", or "DOUB" then the column has REAL affinity.
                return(new DoubleSqlLiteralType(_castEditor));
                //} else if(typeName == "STRING" ||
                //          typeName == "OBJECT") {
                //  //SQLite.NETはnone型テーブル列を"Object"や"String"という複数の型名で返すようだ
                //  return new StringSqlLiteralType(_castEditor);
            }
            else if (typeName == "NONE")
            {
                //SQLite.NETはnone型テーブル列を"none"という複数の型名で返すようだ
                return(new StringSqlLiteralType(_castEditor));
            }
            else
            {
                //5. Otherwise, the affinity is NUMERIC.
                return(new NumberSqlLiteralType(_castEditor));
            }
        }
Exemple #18
0
 public virtual object AfterCast_ViewColumnType(DecimalViewColumnType viewColumnType
                                                , ViewColumnInfo aViewColumnInfo
                                                , object propertyValue)
 {
     return(propertyValue);
 }
Exemple #19
0
 public virtual object BeforeCast_ViewColumnType(TimeSpanViewColumnType viewColumnType
                                                 , ViewColumnInfo aViewColumnInfo
                                                 , object viewColumnValue)
 {
     return(viewColumnValue);
 }
Exemple #20
0
        /// <summary>
        /// View列のメタ情報からViewColumnTypeオブジェクトを取得する
        /// </summary>
        /// <param name="aViewColumnInfo"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        private ViewColumnType GetViewColumnType(ViewColumnInfo aViewColumnInfo)
        {
            if (aViewColumnInfo == null || aViewColumnInfo.HostDataType == null)
            {
                throw new InvalidColumnToPropertyCastException(
                          "ADO.NETが返したデータ型が分からないため、プロパティ値をSQLリテラル型に変換できませんでした.");
            }

            //ADO.NETが返すデータ型の完全修飾名
            string typeName = aViewColumnInfo.HostDataType.FullName;

            //StringとIntegerは使用頻度が高いと思われるので、先にチェックする
            if (typeName == "System.String")
            {
                return(new StringViewColumnType(_castEditor));
            }
            else if (typeName == "System.Int32")
            {
                return(new IntegerViewColumnType(_castEditor));
            }
            else if (typeName == "System.Byte" ||
                     typeName == "System.SByte" ||
                     typeName == "System.Int16" ||
                     typeName == "System.UInt16" ||
                     typeName == "System.UInt32" ||
                     typeName == "System.Int64")
            {
                //Byte, SByte, Short, UShort, Integer, UInteger, Longで共用する
                return(new LongViewColumnType(_castEditor));
            }
            else if (typeName == "System.Char" ||
                     typeName == "System.Char[]")
            {
                //Char, Stringで共用する
                return(new StringViewColumnType(_castEditor));
            }
            else if (typeName == "System.UInt64" ||
                     typeName == "System.Decimal")
            {
                //ULong, Decimalで共用する
                return(new DecimalViewColumnType(_castEditor));
            }
            else if (typeName == "System.Single" ||
                     typeName == "System.Double")
            {
                //Single, Doubleで共用する
                return(new DoubleViewColumnType(_castEditor));
            }
            else if (typeName == "System.DateTime")
            {
                //DateTimeで使用する
                return(new DateTimeViewColumnType(_castEditor));
            }
            else if (typeName == "System.TimeSpan")
            {
                //TimeSpanで使用する
                return(new TimeSpanViewColumnType(_castEditor));
            }
            else if (typeName == "System.Boolean")
            {
                //Booleanで使用する
                return(new BooleanViewColumnType(_castEditor));
            }
            else
            {
                throw new InvalidColumnToPropertyCastException("ADO.NETから予期しないデータ型を受け取りました");
            }
        }
Exemple #21
0
 //プロパティ型毎のCast後編集
 public virtual object AfterCast_PropertyType(PropertyType propertyType
                                              , ViewColumnInfo aViewColumnInfo
                                              , object propertyValue)
 {
     return(propertyValue);
 }
Exemple #22
0
 //プロパティ型毎のCast前編集
 public virtual object BeforeCast_PropertyType(PropertyType propertyType
                                               , ViewColumnInfo aViewColumnInfo
                                               , object viewColumnValue)
 {
     return(viewColumnValue);
 }
        public SqlLiteralType GetSqlLiteralTypeOf(ViewColumnInfo aViewColumnInfo)
        {
            if (aViewColumnInfo == null)
            {
                throw new ArgumentNullException("aViewColumnInfo", "aViewColumnInfoがnullです");
            }
            if (aViewColumnInfo.DbColumnTypeName == null)
            {
                throw new ApplicationException(
                          aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                          "に対応するPervasiveのデータ型が分からないため、プロパティ値をSQLリテラル型に変換できませんでした");
            }

            //ADO.NETが返すPervasiveのデータ型名
            string typeName = aViewColumnInfo.DbColumnTypeName;

            if (typeName == "CHAR" ||
                typeName == "VARCHAR" ||
                typeName == "LONGVARCHAR" ||
                typeName == "UNIQUE_IDENTIFIER")
            {
                return(new StringSqlLiteralType(_castEditor));
            }
            else if (typeName == "BIGINT" ||
                     typeName == "CURRENCY" ||
                     typeName == "DECIMAL" ||
                     typeName == "IDENTITY" ||
                     typeName == "INTEGER" ||
                     typeName == "MONEY" ||
                     typeName == "NUMERIC" ||
                     typeName == "NUMERICSA" ||
                     typeName == "NUMERICSTS" ||
                     typeName == "SMALLIDENTITY" ||
                     typeName == "SMALLINT" ||
                     typeName == "TINYINT" ||
                     typeName == "UBIGINT" ||
                     typeName == "UINTEGER" ||
                     typeName == "USMALLINT" ||
                     typeName == "UTINYINT")
            {
                return(new NumberSqlLiteralType(_castEditor));
            }
            else if (typeName == "DATE" ||
                     typeName == "DATE/TIME" ||
                     typeName == "TIMESTAMP")
            {
                return(new DateTimeSqlLiteralType(_castEditor));
            }
            else if (typeName == "BFLOAT4" ||
                     typeName == "BFLOAT8" ||
                     typeName == "DOUBLE" ||
                     typeName == "FLOAT" ||
                     typeName == "REAL")
            {
                return(new DoubleSqlLiteralType(_castEditor));
            }
            else if (typeName == "NUMBER")
            {
                //基本的には、ネイティブデータ型とPsqlDbTypeとは1対1で対応しています。
                //ただし、Pervasiveデータ型NUMBERは、DecimalまたはDoubleのどちらでも取れるので、この限りではありません。
                return(new DoubleSqlLiteralType(_castEditor));
            }
            else if (typeName == "TIME")
            {
                return(new IntervalSqlLiteralType(_castEditor));
            }
            else if (typeName == "BINARY" ||
                     typeName == "BIT" ||
                     typeName == "LONGVARBINARY")
            {
                throw new InvalidPropertyToColumnCastException(
                          aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                          "に対応するPervasiveのデータ型 " + typeName + "はSQLリテラル型に変換できません");
            }
            else
            {
                throw new ApplicationException(
                          aViewColumnInfo.ViewName + "." + aViewColumnInfo.ViewColumnName +
                          "に対応するPervasiveのデータ型が未定義なため、プロパティ値をSQLリテラル型に変換できませんでした");
            }
        }