无法隐式转换类型'int?' 'int'。

时间:2013-05-28 17:42:31

标签: c# executescalar

我收到错误“无法隐式转换类型'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;
}

10 个答案:

答案 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将是OrdersPerHouruser

答案 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;