public virtual DbTypeInfo GetDbTypeInfo(DataRow columnRow)
 {
     var charSize = columnRow.GetAsLong("CHARACTER_MAXIMUM_LENGTH");
       var byteSize = columnRow.GetAsLong("CHARACTER_OCTET_LENGTH");
       var dataTypeString = columnRow.GetAsString("DATA_TYPE").ToLowerInvariant();
       var prec = columnRow.GetAsByte("NUMERIC_PRECISION");
       var scale = columnRow.GetAsByte("NUMERIC_SCALE");
       var isNullable = (columnRow.GetAsString("IS_NULLABLE") == "YES");
       bool isMemo = (charSize < 0 || byteSize < 0);
       var typeDef = Driver.TypeRegistry.FindVendorDbTypeInfo(dataTypeString);
       if(typeDef == null)
     typeDef = Driver.TypeRegistry.Types.FirstOrDefault(td => td.Aliases.Contains(dataTypeString));
       if(typeDef == null)
     return null;
       var isAutoMemo = Driver.TypeRegistry.AutoMemoTypes.Contains(dataTypeString);
       var size = isAutoMemo? -1 : (charSize != 0 ? charSize : byteSize);
       var typeSpec = typeDef.FormatTypeSpec(size, prec, scale, isMemo);
       var typeInfo = new DbTypeInfo(typeDef, typeSpec, isNullable, size, prec, scale, typeDef.DefaultColumnInit);
       // AssignValueConverters(typeInfo); - no need for value converters
       return typeInfo;
 }