type stored sqldbtype example ejemplos .net sql sql-server ado.net sqlparameter

.net - stored - sqlparameter type



¿Cuál es el propósito de System.Data.SqlClient.SqlParameter.IsNullable? (2)

Actualmente estoy intentando escribir una clase de contenedor de C # simple para todos los procedimientos almacenados en una base de datos.

Mientras construía algunos parámetros en C #, noté la propiedad SqlParameter.IsNullable y me pregunté para qué es esto. Que yo sepa, no es posible declarar un parámetro de procedimiento almacenado como NO NULO y, por lo tanto, NULL siempre se puede pasar a cualquier parámetro.

A través de las pruebas, parece que establecer la propiedad IsNullable en falso no tiene ningún efecto y aún permite que la propiedad SqlParameter.Value se establezca en nulo.

¿Alguien puede explicar el propósito de esta propiedad?

Gracias por mirar.

Quienes respondan y buscan la recompensa deben revisar estos enlaces:

¿Cómo restringir NULL como parámetro al procedimiento almacenado SQL Server?

El parámetro SQL es anulable

Asumo que SqlParameter.IsNullable solo tiene sentido cuando ...?

http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/b7a08616-58d1-4cdc-a3e9-9353e292667b


Después de mirar los enlaces y leer algunos artículos en MSDN.

SqlParameter.IsNullable implementa la interfaz IDataParameter.IsNullable y al leer un artículo dice que "los valores nulos se manejan usando la clase DBNull"

DBNull clase DBNull implementa solo un método de interfaz IConvertible.ToType Infrastructure. Convierte el objeto DBNull actual al tipo especificado. "Que también indica" DBNull.Value puede usarse para asignar explícitamente un valor inexistente a un campo de base de datos, aunque la mayoría de los proveedores de datos ADO.NET asignan automáticamente valores de DBNull cuando un campo no tiene un valor válido "

Leer esto significa que la mayoría de las clases de ADO.NET implementan automáticamente esta propiedad y realizan la conversión de tipo NULL a DBNull detrás de la imagen. Según mi entendimiento, asumo si estamos writing our own API por ejemplo, ( System.Data.CustomDatabaseClient , en lugar de System.Data.SqlClient ) para realizar una conexión y otras tareas de la base de datos, y no estoy implementando esta propiedad. .Data.CustomDatabaseClient debe convertir los valores nulos a DBNull explícitamente.

Buscando tus comentarios y cualquier corrección.


La clase SqlParameter hereda de la clase base abstracta DbParameter , que define

public abstract bool IsNullable {get; set;}

Por SqlParameter tanto, SqlParameter debe tener una implementación pública de la propiedad IsNullable . La clase DbParameter es la clase base para todas las implementaciones de parámetros de base de datos que se incluyen en System.Data .

Se debe asumir entonces que hay otros DBMS que permiten o deniegan explícitamente que los parámetros de procedimiento o función se definan explícitamente como que puedan ser nulables o no SqlParameter.IsNullable , y SqlParameter.IsNullable solo existe porque SqlParameter implementa la clase de parámetros de base de datos más genéricos comunes e interfaces que son comunes a Otras clases de interacción de base de datos .NET.

Mirando en el reflector, la clase SqlParameter no usa IsNullable , aparte de pasar el valor cuando se convierte en un " IsNullable Instancia". No indagué en qué se usa la clase InstanceDescriptor , pero sí verifiqué la clase SqlCommand , especialmente el método BuildParamList , que convierte el SqlParameterCollection en la cadena SQL de parámetros enviados a la base de datos.

El método BuildParamList recorre la SqlParameterCollection y usa un StringBuilder para construir la cadena del parámetro. BuildParamList no usa la propiedad o el valor IsNullable en ninguna parte de su implementación. De hecho, una referencia a SqlParameter.IsNullable no aparece en ninguna parte de la clase SqlCommand.

Es posible que haya perdido una referencia a él en algún método interno / privado que pasa un objeto SqlParameter a una clase diferente, pero si el método BuildParamList no lo usa, no importa porque no afecta a la cadena SQL que se envía. a SQL Server.

Además de los casos de prueba que realizó, el examen del contenido de la clase SqlCommand admite la conclusión de que puede ignorar de forma segura el valor de la propiedad SqlParameter.IsNullable .

El lado del servidor SQL se hizo cargo, hice una búsqueda rápida en Internet para ver si podía encontrar algún DBMS que permitiera parámetros de función o procedimiento explícitamente anulables / no anulables. Me detuve cuando me topé con una referencia para DB2 que parecía requerir un atributo específico para establecerse en un procedimiento para permitir que se le pasaran valores nulos. No tengo conocimiento de ningún RDBMS contemporáneo que tenga esta característica, y mi búsqueda no produjo nada más.