Impossible de convertir implicitement le type 'int?' à 'int'.
J'obtiens le message d'erreur "Impossible de convertir implicitement le type 'int?' int'. Une conversion explicite existe (vous manque un plâtre?)" sur mon OrdersPerHour à la ligne de retour. Je ne suis pas sûr pourquoi, parce que mon C# les compétences ne sont pas aussi avancé. Toute aide serait appréciée.
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;
}
source d'informationauteur MaylorTaylor | 2013-05-28
Vous devez vous connecter pour publier un commentaire.
Eh bien, vous êtes casting
OrdersPerHour
à unint?
Encore votre signature de la méthode est
int
:Également un moyen rapide suggestion -> Utiliser les paramètres de votre requêtequelque chose comme:
c'est parce que le type de retour de la méthode est de type int et OrdersPerHour est de type int? (nullable) , vous pouvez résoudre ce problème en retournant sa valeur comme ci-dessous:
aussi vérifier si ses pas la valeur null pour éviter d'exception, comme ci-dessous:
mais dans ce cas, vous devrez retourner une autre valeur dans l'autre partie ou après les si la partie autrement compilateur signalera une erreur que tous les chemins de la valeur de retour de code.
Vous pouvez modifier la dernière ligne suivante (en supposant que vous souhaitez retourner la valeur 0 lorsqu'il n'y a rien en db):
OrdersPerHour = (int?)dbcommand.ExecuteScalar();
Cette déclaration doit être saisie sous la forme,
OrdersPerHour = (int)dbcommand.ExecuteScalar();
Le premier problème rencontré avec votre code est le message
Cela se produit parce que dans le cas où votre requête de base de données permettrait de lever une exception, la valeur pourrait ne pas être quelque chose (vous avez un vide clause catch).
Pour résoudre ce problème, définissez la valeur de ce que vous voulez si la requête échoue, ce qui est probablement
0
:int? OrdersPerHour = 0;
Une fois que c'est fixe, maintenant, il y a l'erreur, vous êtes à poster sur. Cela se produit parce que votre signature de la méthode déclare que vous êtes de retour d'une
int
mais vous êtes en fait en retour d'un nullable int,int?
variable.De sorte à obtenir le
int
partie de votreint?
vous pouvez utiliser le.Value
propriété:Toutefois, si vous avez déclaré votre OrdersPerHour être
null
au début au lieu de0
la valeur peut être nulle si une validation appropriée avant de retourner en est probablement nécessaire (Jetez un plus spécifiques exception, par exemple).Pour ce faire, vous pouvez utiliser le
HasValue
propriété d'être sûr que vous êtes d'avoir une valeur avant de la retourner:Comme une note de côté, puisque vous êtes de codage en C# il serait mieux si vous avez suivi C#'s conventions. Vos paramètres et des variables doit être en camelCase, pas PascalCase. Donc
User
etOrdersPerHour
seraituser
etordersPerHour
.Votre retour de la méthode est de type
int
et que vous essayez de revenir unint?
.simple
Si vous êtes préoccupé par la possible
null
valeur de retour, vous pouvez également exécuter quelque chose comme ceci:De cette façon, vous aurez à composer avec le potentiel des résultats inattendus et peut également fournir une valeur par défaut à l'expression, en entrant
.GetValueOrDefault(-1)
ou quelque chose de plus significatif pour vous.