Cómo controlar Null y DBNull
En este tema se describen los comportamientos esperados al trabajar con valores NULL asociados a los diferentes tipos, además de las opciones que permiten comprobar valores nulos o la existencia de un campo o miembro concreto.
XML
La siguiente información se aplica a XML:
Un valor XML nunca será devuelto de un documento como NULL. Se tratará de una cadena vacía o de un error del tipo "no existe". Cuando se trata de una cadena vacía, se puede producir un error durante la conversión de determinados tipos, como por ejemplo, los campos especificados como tipo entero al crear reglas.
El Compositor de reglas de negocios no permite establecer un campo en NULL o para establecer el tipo de un campo en objeto.
A través del modelo de objetos, puede establecer el tipo en Object. En este caso, el valor devuelto es el tipo al que se evalúa XPath: float, boolean o string, según la expresión XPath.
clases .NET
La siguiente información se aplica a las clases .NET:
No se le permite comparar con null si el tipo de valor devuelto no es un tipo de objeto .
Puede pasar NULL como parámetro en aquellos parámetros que no sean tipos de valores aunque, dependiendo de la implementación del miembro, es posible que se produzca un error en tiempo de ejecución.
Puede establecer campos de tipos derivados de Object en NULL.
Conexión de datos
La siguiente información se aplica a una conexión de datos:
Puede comparar cualquier columna de tabla de base de datos con null, si la tabla permite valores NULL para la columna y el tipo de columna no es text, ntext e image.
Nota
Business Rule Composer permite usar columnas de tipo, texto y ntext, en condiciones. Sin embargo, al ejecutar la directiva, recibirá un mensaje de error que indica: "No se pueden comparar ni ordenar los tipos de datos text, ntext e image, excepto cuando se utiliza el operador IS NULL o LIKE".
Puede establecer cualquier columna de la tabla de la base de datos como NULL si dicha tabla admite valores NULL en la columna.
Business Rule Composer establece automáticamente el tipo de miembro en el enlace al objeto, si compara o establece en NULL para un tipo de valor; cambia de nuevo al tipo original si restablece o reemplaza el argumento .
Para un tipo de cadena, cambia el tipo a objeto si se establece en NULL, pero lo deja como una cadena si se compara con null.
No se puede comparar ni establecer en DBNull.Value del Compositor de reglas de negocios, ya que no cambiará el tipo de columna al objeto .
El motor convertirá un valor DBNull en NULL para realizar una comparación, y convertirá el valor NULL a un valor DBNull para realizar una operación de inserción en la base de datos.
Las pruebas omitirán los valores NULL (así es como funciona SQL Server). Por ejemplo, si tiene la regla "IF db.column > 5 THEN .", solo se prueban las filas que tienen un valor en db.column, se omiten las filas con null.
TypedDataTable y TypedDataRow
La siguiente información se aplica a TypedDataTable y a TypedDataRow:
Business Rule Composer cambia el tipo de campo al objeto de la misma manera que con DataConnections.
Las pruebas generarán un error con los valores NULL, a menos que la comparación se realice con valores NULL. Por ejemplo, habrá un error en la regla "IF db.column > 5 THEN", si alguna fila afirmada tiene un valor NULL.
Tenga en cuenta que, dado que las condiciones se evalúan en paralelo, las pruebas como "IF db.column != NULL AND db.column > 5 THEN" seguirán fallando, ya que ambas pruebas se evalúan potencialmente en cada fila.
Comprobar la existencia de campos o de valores NULL
Al crear reglas de negocios, lo natural es comprobar si un campo existe antes de realizar una comparación con su valor. Sin embargo, si el campo es NULL o no existe, la comparación con el valor generará un error. Imagine que tiene la siguiente regla:
IF Product/Quantity Exists AND Product/Quantity > 1
Se producirá un error en la regla si no existe Product/Quantity. Una de las formas de evitar este problema consiste en transferir un nodo primario a un método del asistente que devuelva el valor del elemento en caso de que exista, o bien cualquier otro valor si no existe. Consulte las siguientes reglas.
Regla 1
IF EXISTS(Product/Quantity) THEN ASSERT(CREATEOBJECT(typeof(Helper), Product/Quantity)
Regla 2
IF Helper.Value == X THEN...
Otra posible solución consiste en crear una regla similar a la siguiente:
IF Product/Quantity Exist Then CheckQuantityAndDoSomething(Product/Quantity)
En el ejemplo anterior, la función CheckQuantityAndDoSomething comprobará el valor del parámetro y se ejecutará si se cumple la condición.
Nota
Como alternativa, puede modificar la propiedad Campo XPath para que el hecho XML detecte errores, pero no es el enfoque recomendado.