2011-04-14 15 views
7

¿Hay alguna manera de determinar en .NET, para cualquier conjunto arbitrario de resultados de SQL Server, si una columna determinada en el resultado puede contener valores nulos?SqlDataReader averiguar si un campo de datos es anulable

Por ejemplo, si tengo las declaraciones

Select NullableColumn From MyTable 

y

Select IsNull(NullableColumn, '5') as NotNullColumn From MyTable 

y me da una datareader así:

var cmd = new SqlCommand(statement, connection); 
var rdr = cmd.ExecuteReader(); 

puedo tener una función como esta?

bool ColumnMayHaveNullData(SqlDataReader rdr, int ordinal) 
{ 
    //???? 
} 

Quiero que devuelva verdadero para el primer enunciado y falso para el segundo enunciado.

rdr.GetSchemaTable() no funciona para esto porque devuelve si la columna subyacente puede ser nula, que no es lo que quiero. Hay funciones en datareader que devuelven el tipo SQL subyacente del campo, pero ninguno me parecen decir si puede ser nulo ..

+1

¿Puedo preguntarle por qué quiere saberlo? – tomfanning

+0

@tomfanning Estoy pirateando un ORM. Deseo iniciar sesión cada vez que alguien intente ejecutar una consulta en la que un campo db anulable se correlacione con un tipo de valor que no admite nulos. – dan

Respuesta

1

Desafortunadamente no se puede porque SQL Server no tiene forma de determinar si un campo es o no anulable. Puede realizar transformaciones arbitrales en los campos del conjunto de resultados (operadores, llamadas a funciones, etc.) y esas transformaciones no tienen metadatos acerca de si pueden o no devolver nulo. Entonces, tiene que resolverlo manualmente o usar vistas con schemabinding ...

1

estoy un poco confundido:

"no funciona para este porque devuelve si la columna subyacente puede ser nulo, lo cual no es lo que quiero. "

'pero ninguno parece dime si puede ser nulo ..'

puede consultar la tabla subyacente para ver si una columna es nula (suponiendo que eso es lo que quieres).

SELECT IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'MyColumn' 
+0

Quiero saber si una columna en el conjunto de resultados puede contener valores nulos, no si la columna en la tabla subyacente puede contener valores nulos. En mi ejemplo, uso un IsNull() en la declaración de selección para convertir los valores nulos en valores no nulos. En este caso, esa columna del conjunto de resultados no puede contener nulos, aunque la columna de la tabla subyacente sí puede contenerlos. – dan

+0

La columna del conjunto de resultados todavía puede contener valores nulos, pero ha reemplazado todos los valores nulos con valores nulos. Entonces, ¿quieres saber si los datos fueron 'borrados'? Podrías recuperar la misma columna dos veces ... una sería cruda con nulos y la otra sería la versión depurada de la misma columna. –

+0

Si he reemplazado todos los valores nulos con valores nulos, la columna del conjunto de resultados no contiene valores nulos. Eso es lo que trato de averiguar, pero sin tener que recorrer las filas para ver los valores individuales. Básicamente, estoy tratando de validar consultas ad-hoc contra un modelo de objetos en tiempo de ejecución. Usted y yo podemos decir simplemente mirando una consulta cuyas columnas de resultados pueden contener valores nulos, por lo que debe haber una forma de escribir una función que pueda resolverlo. – dan

Cuestiones relacionadas