27

「タイプ '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)

2 つが一致する必要があります。


また、簡単な提案 -> Use parameters in your query、次のようなもの:

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

以下のような例外を回避するために、null でないかどうかも確認します。

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が、実際には null 許容の int、int?、変数を返しています。

intの一部を取得するには、次のプロパティint?を使用できます。.Value

return OrdersPerHour.Value;

ただし、OrdersPerHour をnullではなく開始時に宣言した場合0、値が null になる可能性があるため、戻る前に適切な検証が必要になる可能性があります (たとえば、より具体的な例外をスローします)。

これを行うには、HasValueプロパティを使用して、値を返す前に値があることを確認できます。

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

補足として、C# でコーディングしているため、C# の規則に従った方がよいでしょう。パラメータと変数は PascalCase ではなくキャメルケースにする必要があります。とUserととなりOrdersPerHourます。userordersPerHour

于 2013-05-28T17:49:27.477 に答える
2

最後の行を次のように変更できます (db に何もない場合に 0 を返したい場合):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value;
于 2013-05-28T17:48:59.463 に答える
1

メソッドの戻り値の型はintであり、 を返そうとしていますint?

于 2013-05-28T17:45:56.593 に答える
1

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

このステートメントは、次のように入力する必要があります。 OrdersPerHour = (int)dbcommand.ExecuteScalar();

于 2013-05-28T17:51:01.677 に答える