我收到错误“无法隐式转换类型'int?'到'int'。在返回行的OrdersPerHour上存在显式转换(你是否错过了演员?)我不确定为什么,因为我的C#技能不是那么先进。任何帮助将不胜感激。
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;
}
答案 0 :(得分:14)
您正在向OrdersPerHour
int?
OrdersPerHour = (int?)dbcommand.ExecuteScalar();
然而,您的方法签名是int
:
static int OrdersPerHour(string User)
另外一个快速建议 - > 在查询中使用参数,如:
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);
答案 1 :(得分:11)
这是因为你的方法的返回类型是int而OrdersPerHour是int? (可以为空),你可以通过返回它的值来解决这个问题:
return OrdersPerHour.Value
还要检查它是否为空以避免异常,如下所示:
if(OrdersPerHour != null)
{
return OrdersPerHour.Value;
}
else
{
return 0; // depends on your choice
}
但是在这种情况下,你必须在else部分或if部分之后返回一些其他值,否则编译器将标记一个错误,即并非所有代码路径都返回值。
答案 2 :(得分:6)
Int32 OrdersPerHour = 0;
OrdersPerHour = Convert.ToInt32(dbcommand.ExecuteScalar());
答案 3 :(得分:2)
检查变量的声明。一定是这样
public Nullable<int> x {get; set;}
public Nullable<int> y {get; set;}
public Nullable<int> z {get { return x*y;} }
我希望它对您有用
答案 4 :(得分:1)
您可以将最后一行更改为以下(假设您想在db中没有任何内容时返回0):
return OrdersPerHour == null ? 0 : OrdersPerHour.Value;
答案 5 :(得分:1)
您的代码遇到的第一个问题是消息
在访问之前,可能无法初始化局部变量OrdersPerHour。
发生这种情况是因为在数据库查询会抛出异常的情况下,该值可能不会设置为某个值(您有一个空的catch子句)。
要解决此问题,请将值设置为查询失败时您想要的值,这可能是0
:
int? OrdersPerHour = 0;
修复此问题后,现在发布的错误就是您要发布的错误。发生这种情况是因为您的方法签名声明您返回int
,但实际上您正在返回一个可为空的int int?
变量。
为了获得int
的{{1}}部分,您可以使用int?
属性:
.Value
但是,如果您在开始时将OrdersPerHour声明为return OrdersPerHour.Value;
而不是null
,则该值可以为null,因此可能需要在返回之前进行适当的验证(例如,抛出更具体的异常,例如)。
为此,您可以使用0
属性确保在返回之前有值:
HasValue
作为旁注,由于您使用C#进行编码,因此遵循C#的约定会更好。您的参数和变量应该在camelCase中,而不是PascalCase中。因此if (OrdersPerHour.HasValue){
return OrdersPerHour.Value;
}
else{
// Handle the case here
}
和User
将是OrdersPerHour
和user
。
答案 6 :(得分:1)
OrdersPerHour = (int?)dbcommand.ExecuteScalar();
此声明应输入为,
OrdersPerHour = (int)dbcommand.ExecuteScalar();
答案 7 :(得分:1)
如果您关注可能的null
返回值,您还可以运行以下内容:
int ordersPerHour; // can't be int? as it's different from method signature
// ... do stuff ... //
ordersPerHour = (dbcommand.ExecuteScalar() as int?).GetValueOrDefault();
这样您就可以处理潜在的意外结果,也可以通过输入.GetValueOrDefault(-1)
或更有意义的内容为表达式提供默认值。
答案 8 :(得分:0)
您的方法的返回类型为int
,而您尝试返回int?
。
答案 9 :(得分:0)
简单
(i == null) ? i.Value : 0;