Не можа няяўна пераўтварыць тып "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;
}
16

9 адказы

Well you're casting OrdersPerHour to an int?

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

Тым не менш, ваш метад подпісы Int :

static int OrdersPerHour(string User)

Also a quick suggestion -> Use parameters in your query, something like:

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);
12
дададзена
Я разумею сваю памылку на гэтай часткі ў цяперашні час. Але пасля таго, як зрабіць гэтыя змены, я атрымліваю «User з непрызначаны лакальных пераменнага" OrdersPerHour "на зваротнай лініі.
дададзена аўтар MaylorTaylor, крыніца
Добра, што скіраваў на мяне прама; Аднак, цяпер я атрымліваю яшчэ адну праблему. stackoverflow.com/questions/16744510/…
дададзена аўтар MaylorTaylor, крыніца
@MaylorTaylor Змяніць Int? OrdersPerHour; у Int OrdersPerHour = 0; , павінны клапаціцца аб ім.
дададзена аўтар Dimitar Dimitrov, крыніца

гэта таму, што тып звароту вашага метаду з'яўляецца INT і OrdersPerHour з'яўляецца INT? (Обнулять), вы можаце вырашыць гэтую праблему, вяртаючы яго значэнне, як паказана ніжэй:

return OrdersPerHour.Value

Акрамя таго, праверце, калі яго не роўна нулю, каб пазбегнуць выключэння, як, як паказана ніжэй:

if(OrdersPerHour != null)
{

    return OrdersPerHour.Value;

}
else
{

  return 0;//depends on your choice

}

але ў гэтым выпадку вам прыйдзецца вярнуцца некаторы іншае значэнне ў астатні часткі ці пасля таго, як калі частка у адваротным выпадку кампілятар сцяг памылкі, што не ўсе шляхі кода вяртаецца значэння.

11
дададзена
Int32 OrdersPerHour = 0;
OrdersPerHour = Convert.ToInt32(dbcommand.ExecuteScalar());
5
дададзена

Вы можаце змяніць апошнюю радок наступным чынам (мяркуецца, што вы хочаце вярнуць 0, калі няма нічога ў дб):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value;
1
дададзена

Першая праблема, сустракаемая з вашым кодам з'яўляецца паведамленне

<�Р> Лакальная пераменная OrdersPerHour не можа быць ініцыялізаваны перад атрыманнем доступу.

Гэта адбываецца таму, што ў выпадку, калі зварот у базу, будзе згенеравана выключэнне, значэнне можа не быць усталяваны на нешта (у вас ёсць пусты пункт злавіць).

Каб выправіць гэта, усталюйце значэнне тое, што вы хацелі б мець, калі запыт не ўдаецца, што, верагодна, 0 :

<�Код> Int? OrdersPerHour = 0;

Пасля таго, як гэта зафіксавана, зараз ёсць памылка Вы адпраўляеце а. Гэта адбываецца таму, што ваш метад подпісы дэкларуе вы вяртаеце Int , але вы на самой справе вяртаючы обнулять ИНТ Int? пераменная.

Такім чынам, каб атрымаць Int частка вашага Int , вы можаце выкарыстоўваць .Value ўласцівасць:

return OrdersPerHour.Value;

Тым не менш, калі вы абвясцілі пра сваю OrdersPerHour быць нулявым пры запуску замест 0 , значэнне можа быць пустым, таму належная праверка перад вяртаннем, верагодна, неабходна (Кідай больш канкрэтнае выключэнне , напрыклад).

Для гэтага, вы можаце выкарыстоўваць HasValue ўласцівасць, каб пераканацца, што вы, якія маюць значэнне перад яго вяртаннем:

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

У якасці заўвагі, так як вы кадавання ў C# было б лепш, калі б вы вынікалі канвенцыі C# 's. Ваш параметр і зменныя павінны быць у вярблюджага, ня PascalCase. Так User і OrdersPerHour будзе карыстальнік і ordersPerHour .

1
дададзена

<�Код> OrdersPerHour = (цэлае?) Dbcommand.ExecuteScalar ();

This statement should be typed as, OrdersPerHour = (int)dbcommand.ExecuteScalar();

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) ці нешта больш значным для вас.

0
дададзена

Ваш метад у які вяртаецца тып Int і вы спрабуеце вярнуць Int? .

0
дададзена

просты

(i == null) ? i.Value : 0;
0
дададзена
Хоць гэта тэарэтычна можа працаваць, гэта не тлумачыць, як гэта працуе, каб хто-небудзь. Кажучы «проста» не хапае на самай справе.
дададзена аўтар Wai Ha Lee, крыніца
.. Гэта <�б> вызначана не будзе працаваць. У вас ёсць NullReferenceException пры я == NULL і вяртае 0 , калі гэта не так.
дададзена аўтар Wai Ha Lee, крыніца