Compartir a través de


identificador y asignación de propiedad

Asignar conceptos genéricos a los elementos y a las propiedades de identificador es más complicado que tipos de asignación, como se describe en Asignación de tipos. Por ejemplo, además de tener b: el problema de g a solucionar, como ocurre con la asignación de tipos, hay la planeación agregada de asignación de los datos. Administrar datos requiere asignar la conversión correcta de datos dato-origen-específicos al formato esperado por conceptos genéricos.

En esta y las siguientes secciones, explicaremos la planeación más difícil de asignación de los datos y luego aplicaremos esa conversación a los diferentes tipos de b: problema de g :

  • asignación de los datos

  • identificador y asignación de propiedad

  • Asignación de los datos de 1:1

  • 1: asignación de los datos de g

  • b: 1 Asignación de datos

  • b: asignación de los datos de g

asignación de los datos

La asignación de datos muestra dificultades de dos tipos principales. Primero, existe la planeación de tipos de datos en conflicto como, por ejemplo, cuando los valores true y false de Booleano-tipo se almacenan como cadenas. En segundo lugar, hay un problema de los mismos valores que representan los mismos datos como, por ejemplo, cuando usa los valores de índice de la cadena “0 ", “1 " y “2 " junto con los valores de cadena análogos “NONKEY”, “UNIQUE” y “PRIMARY”.

Para proporcionar la mayor flexibilidad, un proveedor de datos puede especificar una serie de pasos de conversión que, cuando se seguidos, convierten un valor dato-origen-específico un valor coherente con un tipo asignado genérico. Cada paso de la conversión puede implementar una de las acciones siguientes:

  • ChangeType
    Para realizar una conversión de tipos en el valor actual, llame al método Convert.ChangeTypede .NET Framework. Es el proveedor de datos para asegurarse de que el valor actual es de un tipo que se pueda convertir (es decir, que implementa la interfaz de IConvertible Interface ), y que contiene los datos que se pueden convertir correctamente.

  • Match
    Para analizar una representación de cadena del valor actual, use una expresión regular de .NET. Esto genera un conjunto de valores actuales iguales a los valores de cada grupo coincidente (o si no se especifica ningún grupo, el único valor correspondiente). Si no se encuentra ninguna coincidencia, elija un conjunto predeterminado de nuevos valores actuales especificados por el proveedor. Si el proveedor tiene una coincidencia se encontrará siempre, los valores predeterminados no necesita ser especificada.

  • Split
    Para analizar una representación de cadena del valor actual en elementos han separado por una cadena que coincida con la expresión, se utiliza una expresión regular de .NET. Esto genera un conjunto de valores actuales iguales a los valores de cada parte de la cadena.

  • Replace
    Para analizar una representación de cadena del valor actual y después utilizar un modelo de reemplazo para compilar un nuevo valor actual basado en valores de grupo coincidentes, use una expresión regular de .NET.

  • Format
    Para compilar una cadena basada en valores actuales, utilice una cadena de formato de .NET. Pasan al conjunto de valores actuales como parámetros de formato en la llamada de función String.Format , que permite hacer referencia al conjunto de valores actuales utilizando {0}, {1}, etc.

  • Calculate
    Para compilar un nuevo valor de configuración actual, use una expresión de ADO.NET . La cadena de la expresión primero se pasa con String.Format con el conjunto de valores actuales como parámetros de formato, que permite hacer referencia a estos valores con {0}, {1}, etc. Hacer referencia a valores de esta manera requiere el uso de un carácter de escape cuando hay entre llaves en la cadena a la que se hace referencia.

  • CallMapper
    este elemento debe ser la conversión pasada en el conjunto de pasos de la conversión. Especifica un método personalizado denominado para convertir el valor del miembro asignado, y también contiene el tipo que implementa este método.

Para cada una de las acciones anteriores, uno o más valores actuales pueden contener datos que la acción puede hacer referencia. Cuando comienza una conversión, un valor actual inicial es igual al valor dato-origen-específico. Mientras que los pasos de conversión continúan, estos valores actuales se modifican, finalizando hacia arriba como valor convertido final.

Esta arquitectura de conversión-paso permite que los proveedores de datos manipulan prácticamente cualquier dato dato-origen-específico en el tipo y el formato adecuados para el tipo asignado genérico que representa.

identificador y asignación de propiedad

El problema de b: g para los elementos y las propiedades de identificador aparece porque puede tener datos compilado o analizado de otros datos. Por ejemplo, un tipo de datos de columna puede estar compuesta de un nombre de tipo, una longitud, una precisión, y una escala. Algunos, todos, o ninguno de estos datos podrían ser parte de una propiedad. El problema de b: g aparece cuando los identificadores o propiedades genéricos equivalente no se empaquetarán.

Como ejemplo, considere una base de datos de SQL Server que expone el tipo de datos de una columna como una sola propiedad que abarca el nombre de tipo, la longitud, la precisión, la escala. Si un tipo de datos asignado de tipo genérico de propiedad espera que un formato específico de esta información y SQL sólo ocurre coincidir con este formato, la asignación es 1:1 y no hay ningún problema (vea el ejemplo de código, más adelante). Por otra parte, si existe ningún tipo de datos asignado genérico, Longitud, Precisión, y la escala de los tipos de propiedad (que es mucho más probable), tiene un 1:g asignación-que es, una sola propiedad dato-origen-específica (tipo de datos) que representa más de una propiedad genérica concepto-en este caso, tipo de datos, Longitud, Precisión, escala y. Vea el ejemplo de código siguiente.

Tome para otro ejemplo el caso de una base de datos que tiene propiedades dato-origen-específicas IsPrimaryKey e IsUniqueKey como tipo de índice. Supongamos, también, que hay un concepto genérico de la propiedad, IndexKeyType, que utiliza un vector de bits para especificar (a) si el índice es una clave, y (b) si es que tipo de clave. (En este caso el índice clave podría no ser ningún key=0, UNIQUE key=1, y key=2. primario) En este escenario, tenemos b: 1 asignación, en la que las propiedades dato-origen-específicas varios se representan mediante un único concepto genérico de la propiedad (vea ejemplo de código, más adelante).

Finalmente, considere un ejemplo del caso más complicado, en el que existe ningún tipo de datos dato-origen-específico y DataTypeNumInfo de propiedades. La propiedad de tipo de datos incluye un nombre y una longitud, y la propiedad de DataTypeNumInfo incluye la precisión y la escala. ahora suponga que hay propiedades genéricas DataTypeName y DataTypeInfo. La propiedad de DataTypeName contiene solo un nombre, y la propiedad de DataTypeInfo incluye la longitud, la precisión, la escala. Esto es b: g que asigna, donde las propiedades dato-origen-específicas varios se representan mediante las propiedades genéricas.

Los siguientes son resúmenes y ejemplos de código de cada uno de los escenarios de identificador y de la asignación de propiedades.

Asignación de los datos de 1:1

la asignación unívoca es el caso más simple y requiere poco trabajo. Un proveedor de datos tiene una sola parte o propiedad dato-origen-específica ID que se asignan a una única parte ID o concepto genérica de propiedades como en el ejemplo siguiente:

<Type name="Table" preferredOrdering="Database, Schema, Name">
...
    <Properties>
...
        <Property name="ObjectType" type="System.String" />
    </Properties>
</Type>

<MappedType name="Table" underlyingType="Table">
...
    <Properties>
        <Property name="IsSystemObject" underlyingMember="ObjectType">
            <Conversion>
                <Calculate expr="IIF({0}=SYSTEM,true,false") exprType="System.Boolean" />
            </Conversion>
        </Property>
   </Properties>
</MappedType>

En este ejemplo, una propiedad dato-origen-específica, ObjectType, puede contener dos valores de cadena, “USER” y “SYSTEM”. Mapas de esta información al tipo asignado genérico IsSystemObject, que se define como un valor booleano. Así, un paso de conversión calcula una expresión booleana basada en el valor de cadena dato-origen-específico.

1: asignación de los datos de g

el 1: el caso de g es algo más complicado. Un proveedor de datos tiene una sola parte o propiedad dato-origen-específica ID que se asignan a elementos o propiedades genéricas varias ID. Para funcionar correctamente, el proveedor de datos aplica una asignación especificando propiedades genéricas varios con el mismo valor de underlyingMember, como se muestra en el código siguiente:

<Type name="Column" preferredOrdering="Database, Schema, Table, Id">
...
    <Properties>
...
        <Property name="DataType" type="System.String" />
    </Properties>
</Type>

<MappedType name="TableColumn" underlyingType="Column">
...
    <Properties>
        <Property name="DataType" underlyingMember="DataType">
            <Conversion>
                <Match regex="^[^(]+" />
            </Conversion>
        </Property>
        <Property name="Length" underlyingMember="DataType">
            <Conversion>
                <Match regex="(?<=^CHAR\(|^VARCHAR\()\d+">
                    <Defaults>
                        <Default value="0" />
                    </Defaults>
                </Match>
                <ChangeType type="System.Int32" />
            </Conversion>
        </Property>
        <Property name="Precision" underlyingMember="DataType">
            <Conversion>
                <Match regex="(?<=^NUMERIC\()\d+">
                    <Defaults>
                        <Default value="0" />
                    </Defaults>
                </Match>
                <ChangeType type="System.Int32" />
            </Conversion>
        </Property>
   </Properties>
</MappedType>

En este ejemplo, una propiedad dato-origen-específica, tipo de datos, contiene información para tres propiedades genéricas. Comienza con el nombre del tipo de datos y, a continuación en corchetes contiene información sobre la longitud para tipos de carácter y, a continuación sobre la precisión del tipo numérico.

Para recuperar un valor para el tipo de datos asignado genérico de la propiedad, el proveedor debe extraer la primera parte del valor dato-origen-específico utilizando una expresión regular simple que coincida con las palabras a un corchete abierto.

Para recuperar un valor para la propiedad asignada genérica Longitud, el proveedor debe extraer el primer número entre corchetes, pero sólo si es un tipo de datos de los valores. De lo contrario, el valor es cero. La expresión regular especificada hace en colaboración con el valor predeterminado indicado. Un segundo acción convierte la cadena extraída al tipo correcto esperado por el concepto genérico de la propiedad.

Para recuperar un valor para la propiedad asignada genérica Precision, el proveedor debe extraer el primer número entre corchetes, pero sólo si es un tipo de datos numérico. De lo contrario, el valor es cero. La expresión regular especificada hace en colaboración con el valor predeterminado indicado. Un segundo acción convierte la cadena extraída al tipo correcto esperado por el concepto genérico de la propiedad.

b: 1 Asignación de datos

Este caso requiere un poco más trabajo que 1: la asignación de g . En este escenario, un proveedor de datos tiene las partes o propiedades dato-origen-específicas varias ID que se asignan a una única parte ID o concepto genérica de la propiedad. Los proveedores de datos solicitan esta asignación especificando un valor separado por comas el atributo de underlyingMember de elemento de propiedad que contiene todas las propiedades dato-origen-específicas que se asignan a la propiedad genérica, como se muestra en el ejemplo de código siguiente:

<Type name="Index" preferredOrdering="Database, Schema, Table, Name">
...
    <Properties>
        <Property name="IsUniqueKey" type="System.Boolean" />
        <Property name="IsPrimaryKey" type="System.Boolean" />
...
    </Properties>
</Type>

<MappedType name="TableIndex" underlyingType="Index">
...
    <Properties>
        <Property name="DataType" underlyingMember="DataType">
            <Conversion>
                <Match regex="^[^(]+" />
            </Conversion>
        </Property>
        <Property name="IndexKeyType" underlyingMember="IsUniqueKey,IsPrimaryKey">
           <Conversion>
               <Calculate expr="IIF({0}=true,
                                IIF({1}=true,PRIMARY,UNIQUE),
                                NONE)"
                          type="System.String" />
           </Conversion>
        </Property>
        <Property name="Precision" underlyingMember="DataType">
            <Conversion>
                <Match regex="(?<=^NUMERIC\()\d+">
                    <Defaults>
                        <Default value="0" />
                    </Defaults>
                </Match>
                <ChangeType type="System.Int32" />
            </Conversion>
        </Property>
   </Properties>
</MappedType>

En este ejemplo, las propiedades dato-origen-específicas IsUniqueKey e IsPrimaryKey son true o false basándose en un índice es una clave o no, y si es así el tipo. La propiedad genérica IndexKeyType es una cadena que es igual a NONE, a UNIQUE, o a PRIMARY.

Ambas propiedades dato-origen-específicas se necesitan proporcionar información completa para la propiedad genérica. Por consiguiente, el proveedor debe combinar el contenido de varias propiedades en una y una conversión debe aparecer.

b: asignación de los datos de g

Este caso muestra una combinación de 1: g y b: 1 asignación. Un proveedor de datos tiene las partes o propiedades dato-origen-específicas varias ID que se asignan a elementos o propiedades genéricas varias ID. Los proveedores de datos se aplican esta asignación especificando varias propiedades de origen de datos que se asignan a las propiedades genéricas múltiples, como se muestra en el ejemplo siguiente:

<Type name="Column" preferredOrdering="Database, Schema, Table, Id">
...
    <Properties>
        <Property name="DataType" type="System.String" />
        <Property name="DataTypeNumInfo" type="System.String" />
...
    </Properties>
</Type>

<MappedType name="TableColumn" underlyingType="Column">
...
    <Properties>
        <Property name="DataTypeName" underlyingMember="DataType">
            <Conversion>
                <Match regex="^[^(]+" />
            </Conversion>
        </Property>
        <Property name="DataTypeInfo" underlyingMember="DataType,DataTypeNumInfo">
            <Conversion>
                <Format string="{0}#{1}" />
                <Replace regex="\((\d+)\)#(\d+),(\d+)" pattern="$1,$2,$3" />
            </Conversion>
        </Property>
...
   </Properties>
</MappedType>

En este ejemplo, el tipo de datos dato-origen-específico y DataTypeNumInfo de las propiedades proporcionan un tipo de datos con longitud, la precisión, la escala, respectivamente. La propiedad genérica DataTypeName contiene únicamente el nombre, y DataTypeInfo contiene la longitud, la precisión, y la información de la escala.

Para recuperar un valor para la propiedad genérica DataTypeName, el proveedor debe extraer a la primera parte del tipo de datos dato-origen-específico de propiedad con una expresión regular simple que coincida con las palabras hasta un corchete abierto.

Para recuperar un valor para la propiedad genérica DataTypeInfo, el proveedor de datos debe extraer la segunda parte del tipo de datos dato-origen-específico de las dos partes de la propiedad dato-origen-específica DataTypeNumInfo y, a continuación pegue conjuntamente en el formato correcto. Esto se realiza primero concatenando ambas propiedades en una sola cadena, y utilizando una expresión regular coincida con la longitud, la precisión, y la información de la escala. Por último, el proveedor de datos realiza una operación de reemplazo para crear una nueva cadena única con esta información en el formato correcto.

Vea también

Conceptos

Identificadores y propiedades del tipo de objeto a los tipos genéricos

Asignación de tipos