una tipo puede implícitamente implicitamente float explícita existe entero convertir conversión bool c# executescalar

c# - implicitamente - No se puede convertir implícitamente el tipo ''int?'' a ''int''.



no se puede convertir implícitamente el tipo string en bool (9)

¿El tipo de retorno de su método es int y está intentando devolver un int? .

Recibo el error "¿No se puede convertir implícitamente el tipo ''int?'' a ''int''. Existe una conversión explícita (¿falta un lanzamiento?) "en mi OrdersPerHour en la línea de devolución. No estoy seguro de por qué, porque mis habilidades en C # no son tan avanzadas. Cualquier ayuda sería apreciada.

static int OrdersPerHour(string User) { int? OrdersPerHour; OleDbConnection conn = new OleDbConnection(strAccessConn); DateTime curTime = DateTime.Now; try { string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > #" + curTime.AddHours(-1) + "# AND User = ''" + User + "'' AND Log.EndStatus in (''Needs Review'', ''Check Search'', ''Vision Delivery'', ''CA Review'', ''1TSI To Be Delivered'');"; OleDbCommand dbcommand = new OleDbCommand(query, conn); dbcommand.Connection.Open(); dbcommand.CommandType = CommandType.Text; OrdersPerHour = (int?)dbcommand.ExecuteScalar(); Console.WriteLine("Orders per hour for " + User + " is " + OrdersPerHour); } catch (OleDbException ex) { } finally { conn.Close(); } return OrdersPerHour; }


Bueno, ¿estás lanzando OrdersPerHour a un int?

OrdersPerHour = (int?)dbcommand.ExecuteScalar();

Sin embargo, su firma de método es int :

static int OrdersPerHour(string User)

También una sugerencia rápida -> Use parámetros en su consulta , algo como:

string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > ? AND User = ? AND Log.EndStatus in (''Needs Review'', ''Check Search'', ''Vision Delivery'', ''CA Review'', ''1TSI To Be Delivered'')"; OleDbCommand dbcommand = new OleDbCommand(query, conn); dbcommand.Parameters.Add(curTime.AddHours(-1)); dbcommand.Parameters.Add(User);


El primer problema encontrado con tu código es el mensaje.

Es posible que la variable local OrdersPerHour no se inicialice antes de acceder.

Ocurre porque en el caso en el que su consulta de base de datos arrojaría una excepción, el valor podría no establecerse en algo (tiene una cláusula de captura vacía).

Para solucionar este problema, establezca el valor en lo que desearía tener si falla la consulta, que probablemente sea 0 :

int? OrdersPerHour = 0;

Una vez que esto se arregla, ahora está el error sobre el que estás publicando. Esto sucede porque la firma de su método declara que está devolviendo un int , pero de hecho, ¿está devolviendo un int nullable int, int? , variable.

¿Entonces para obtener la parte int de tu int? , puedes usar la propiedad .Value :

return OrdersPerHour.Value;

Sin embargo, si declaró que su OrdersPerHour era null al inicio en lugar de 0 , el valor puede ser nulo, por lo que probablemente sea necesaria una validación adecuada antes de regresar (por ejemplo, arroje una excepción más específica).

Para hacerlo, puede usar la propiedad HasValue para asegurarse de que tiene un valor antes de devolverlo:

if (OrdersPerHour.HasValue){ return OrdersPerHour.Value; } else{ // Handle the case here }

Como nota al margen, ya que estás codificando en C # sería mejor si siguieras las convenciones de C #. Su parámetro y variables deben estar en camelCase, no en PascalCase. Por lo tanto, User y OrdersPerHour sería user y ordersPerHour .


Puede cambiar la última línea a la siguiente (asumiendo que desea devolver 0 cuando no hay nada en la base de datos):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value;


Si le preocupa el posible null retorno null , también puede ejecutar algo como esto:

int ordersPerHour; // can''t be int? as it''s different from method signature // ... do stuff ... // ordersPerHour = (dbcommand.ExecuteScalar() as int?).GetValueOrDefault();

De esta manera, lidiará con los posibles resultados inesperados y también puede proporcionar un valor predeterminado a la expresión, ingresando .GetValueOrDefault(-1) o algo más significativo para usted.


esto se debe a que el tipo de retorno de su método es int y OrdersPerHour es int? (anulable), puede resolver esto devolviendo su valor como a continuación:

return OrdersPerHour.Value

También verifique si no es nulo para evitar una excepción como la siguiente:

if(OrdersPerHour != null) { return OrdersPerHour.Value; } else { return 0; // depends on your choice }

pero en este caso, tendrá que devolver algún otro valor en la parte else o después de que, en caso contrario, el compilador marque un error que indique que no todas las rutas de acceso de código devuelven valor.


sencillo

(i == null) ? i.Value : 0;


OrdersPerHour = (int?)dbcommand.ExecuteScalar();

Esta declaración debe escribirse como, OrdersPerHour = (int)dbcommand.ExecuteScalar();


Int32 OrdersPerHour = 0; OrdersPerHour = Convert.ToInt32(dbcommand.ExecuteScalar());