with operator convert comprobar c# .net ado.net

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) ;