public virtual object BeforeCast(BooleanViewColumnType viewColumnType , PropertyType propertyType , ViewColumnInfo aViewColumnInfo , object viewColumnValue) { return(viewColumnValue); }
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)); }
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)); }
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)); }
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; } }
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 })); }
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)); }
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リテラル型に変換できませんでした"); } }
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)); }
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; } }
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)); }
internal abstract object CastTo(PropertyType propertyType , ViewColumnInfo aViewColumnInfo , object 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 + "に対応する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リテラル型に変換できませんでした"); } }
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)); } }
public virtual object AfterCast_ViewColumnType(DecimalViewColumnType viewColumnType , ViewColumnInfo aViewColumnInfo , object propertyValue) { return(propertyValue); }
public virtual object BeforeCast_ViewColumnType(TimeSpanViewColumnType viewColumnType , ViewColumnInfo aViewColumnInfo , object viewColumnValue) { return(viewColumnValue); }
/// <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から予期しないデータ型を受け取りました"); } }
//プロパティ型毎のCast後編集 public virtual object AfterCast_PropertyType(PropertyType propertyType , ViewColumnInfo aViewColumnInfo , object propertyValue) { return(propertyValue); }
//プロパティ型毎の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リテラル型に変換できませんでした"); } }