operator - nullable class c#
Error de conversión de la base de datos smallint en C#nullable int (2)
Tengo una columna security_role_cd en la base de datos del tipo de datos smallint
. Estoy seleccionando esta columna usando el siguiente código en una variable nullable int
.
Estoy recibiendo el siguiente error:
Error 3 El tipo de expresión condicional no se puede determinar porque no hay conversión implícita entre ''nulo'' y ''corto''
¿Cuál es el código correcto para superar este error?
SELECT R.security_role_cd FROM Security_Role R WHERE security_role_name = ''Admin''
DO#
int? roleID = null;
string commandText = "SELECT R.security_role_cd FROM Security_Role R WHERE security_role_name = @roleName";
SqlCommand command = new SqlCommand(commandText, connection);
command.CommandType = System.Data.CommandType.Text;
command.Parameters.AddWithValue("@roleName",roleName);
SqlDataReader readerRole = command.ExecuteReader();
if (readerRole.HasRows)
{
while (readerRole.Read())
{
roleID = readerRole.GetInt16(0) == 0 ? null : readerRole.GetInt16(0) ;
}
}
readerRole.Close();
Solo necesita saber cómo escribir el null
:
roleID = readerRole.GetInt16(0) == 0 ? (int?)null : (int)readerRole.GetInt16(0);
Personalmente, guardaría el valor en caché:
int tmp = readerRole.GetInt16(0); // implicit widening to int here
roleID = tmp == 0 ? (int?)null : tmp;
Aunque también pondría en duda la sabiduría de convertir un 0
en un null
, es mejor usar IsDBNull
, algo así como:
if(reader.IsDBNull(0)) {
roleID = null;
} else {
roleID = (int)readerRole.GetInt16(0);
}
Prueba esto
roleID = readerRole.GetInt16(0) == 0 ? (int?) null : readerRole.GetInt16(0) ;
De acuerdo con la documentación del operador ternario, el tipo de datos a ambos lados del colon (:) tiene que ser el mismo. Como lo tenía sin conversión, no se pudo determinar el tipo de nulo (es decir, si nullable int, o null string, o null object)
Actualizar
roleID = readerRole.GetInt16(0) == 0 ? (int?) null : readerRole.GetInt32(0) ;