27

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

10 回答 10

23

好吧,你正在投射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);
于 2013-05-28T17:44:59.413 回答
17

这是因为您的方法的返回类型是 int 而 OrdersPerHour 是 int?(nullable) ,您可以通过返回它的值来解决这个问题,如下所示:

return OrdersPerHour.Value

还要检查它是否不为空以避免异常,如下所示:

if(OrdersPerHour != null)
{

    return OrdersPerHour.Value;

}
else
{

  return 0; // depends on your choice

}

但在这种情况下,您必须在 else 部分或 if 部分之后返回一些其他值,否则编译器将标记一个错误,并非所有代码路径都返回值。

于 2013-05-28T17:50:44.317 回答
6
Int32 OrdersPerHour = 0;
OrdersPerHour = Convert.ToInt32(dbcommand.ExecuteScalar());
于 2013-07-19T07:06:56.833 回答
3

您的代码遇到的第一个问题是消息

局部变量 OrdersPerHour 在访问之前可能未初始化。

发生这种情况是因为在您的数据库查询会引发异常的情况下,该值可能未设置为某个值(您有一个空的 catch 子句)。

要解决此问题,请将值设置为查询失败时想要的值,这可能是0

int? OrdersPerHour = 0;

一旦解决了这个问题,现在就会出现您发布的错误。发生这种情况是因为您的方法签名声明您正在返回一个int,但实际上您正在返回一个可为空的 int, int?, 变量。

因此,要获得您的int部分int?,您可以使用以下.Value属性:

return OrdersPerHour.Value;

但是,如果您将 OrdersPerHour 声明为nullat start 而不是0,则该值可以为 null ,因此可能需要在返回之前进行适当的验证(例如,引发更具体的异常)。

为此,您可以使用该HasValue属性来确保在返回它之前有一个值:

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

附带说明一下,由于您使用 C# 进行编码,因此如果您遵循 C# 的约定会更好。您的参数和变量应该是驼峰式,而不是 PascalCase。所以UserOrdersPerHouruserordersPerHour

于 2013-05-28T17:49:27.477 回答
2

您可以将最后一行更改为以下内容(假设您想在 db 中没有任何内容时返回 0):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value;
于 2013-05-28T17:48:59.463 回答
2

检查变量的声明。应该是这样的

public Nullable<int> x {get; set;}
public Nullable<int> y {get; set;}
public Nullable<int> z {get { return x*y;} }

我希望它对你有用

于 2020-05-22T11:15:08.017 回答
1

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

该语句应键入为, OrdersPerHour = (int)dbcommand.ExecuteScalar();

于 2013-05-28T17:51:01.677 回答
1

您的方法的返回类型是int并且您正在尝试返回一个int?.

于 2013-05-28T17:45:56.593 回答
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)或对您更有意义的内容为表达式提供默认值。

于 2017-10-17T10:16:55.447 回答
-1

简单的

(i == null) ? i.Value : 0;
于 2015-09-09T06:59:07.100 回答