private static IDataFieldReader CreateDataFieldReader(
            IDataRecord dataRecord,
            DataRow schemaRow)
        {
            var sqLiteDataReader = (SQLiteDataReader)dataRecord;
            var columnOrdinal    = (int)schemaRow["ColumnOrdinal"];
            var dbType           = (DbType)schemaRow[SchemaTableColumn.ProviderType];
            IDataFieldReader dataFieldReader;

            switch (dbType)
            {
            case DbType.Decimal:
                dataFieldReader = new DecimalDataFieldReader(sqLiteDataReader, columnOrdinal);
                break;

            case DbType.Binary:
                dataFieldReader = new BinaryDataFieldReader(sqLiteDataReader, columnOrdinal);
                break;

            default:
                dataFieldReader = new DefaultDataFieldReader(sqLiteDataReader, columnOrdinal);
                break;

                //    case DbType.
                //case "BLOB":
                //    dataFieldReader = new BinaryDataFieldReader( dataRecord, columnOrdinal );
                //    break;

                //case "DECIMAL":
                //    dataFieldReader = new DecimalDataFieldReader( sqLiteDataReader, columnOrdinal );
                //    break;

                //default:
                //    dataFieldReader = new DefaultDataFieldReader( dataRecord, columnOrdinal );
                //    break;
            }

            return(dataFieldReader);
        }
        private static IDataFieldReader CreateDataFieldReader(IDataRecord dataRecord, FoundationDbColumn dataColumnSchema)
        {
            var columnOrdinal = dataColumnSchema.ColumnOrdinal;
            var providerType  = (SqlDbType)dataColumnSchema.ProviderType;
            IDataFieldReader dataFieldReader;

            switch (providerType)
            {
            case SqlDbType.BigInt:
            case SqlDbType.Bit:
            case SqlDbType.Udt:
            case SqlDbType.Int:
            case SqlDbType.SmallInt:
            case SqlDbType.TinyInt:
            case SqlDbType.UniqueIdentifier:
            case SqlDbType.Real:     //
                dataFieldReader = new DefaultDataFieldReader(dataRecord, columnOrdinal);
                break;

            case SqlDbType.Float:     //
                dataFieldReader = new DoubleFieldReader(dataRecord, columnOrdinal);
                break;

            case SqlDbType.Char:
            case SqlDbType.NChar:
            case SqlDbType.VarChar:
            case SqlDbType.NVarChar:
            case SqlDbType.Text:
            case SqlDbType.NText:
                var columnSize = dataColumnSchema.ColumnSize;

                if (columnSize <= SqlServerProvider.ShortStringSize)
                {
                    dataFieldReader = new ShortStringFieldReader(dataRecord, columnOrdinal, providerType);
                }
                else
                {
                    dataFieldReader = new LongStringFieldReader(dataRecord, columnOrdinal);
                }

                break;

            case SqlDbType.Binary:
            case SqlDbType.VarBinary:
            case SqlDbType.Image:
            case SqlDbType.Timestamp:
                dataFieldReader = new BinaryDataFieldReader(dataRecord, columnOrdinal);
                break;

            case SqlDbType.Decimal:
                dataFieldReader = new DefaultDataFieldReader(dataRecord, columnOrdinal);
                break;

            case SqlDbType.SmallDateTime:
                dataFieldReader = new SmallDateTimeDataFieldReader(dataRecord, columnOrdinal);
                break;

            case SqlDbType.Date:
            case SqlDbType.DateTime:
            case SqlDbType.DateTime2:
                dataFieldReader = new DateTimeDataFieldReader(dataRecord, columnOrdinal);
                break;

            case SqlDbType.DateTimeOffset:
                dataFieldReader = new DateTimeOffsetDataFieldReader(dataRecord, columnOrdinal);
                break;


            case SqlDbType.Time:
                dataFieldReader = new DefaultDataFieldReader(dataRecord, columnOrdinal);
                break;

            case SqlDbType.Money:
                dataFieldReader = new MoneyDataFieldReader(dataRecord, columnOrdinal);
                break;

            case SqlDbType.Variant:
                dataFieldReader = new VariantDataFieldReader(dataRecord, columnOrdinal);
                break;

            //                case SqlDbType.Timestamp:
            //                    dataFieldReader = new TimeStampDataFieldReader(dataRecord,columnOrdinal);
            //                    break;

            case SqlDbType.Xml:
                dataFieldReader = new LongStringFieldReader(dataRecord, columnOrdinal);
                break;

            default:
                throw new Exception();
            }

            return(dataFieldReader);
        }