2013-05-28 63 views
16

Tôi gặp lỗi "Không thể chuyển đổi loại int 'int?' để 'int'. Một chuyển đổi rõ ràng tồn tại (bạn đang thiếu một diễn viên?) "trên OrdersPerHour của tôi tại dòng trở lại. Tôi không chắc tại sao vì kỹ năng C# của tôi không phải là nâng cao. Bất kỳ trợ giúp sẽ được đánh giá cao.Không thể chuyển đổi hoàn toàn loại 'int?' để 'int'.

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; 
} 

Trả lời

11

Vâng, bạn đang đúc OrdersPerHour một int?

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

Tuy nhiên, phương pháp chữ ký của bạn là int:

static int OrdersPerHour(string User) 

Cũng là một gợi ý nhanh chóng ->Sử dụng các thông số trong truy vấn của bạn, somethi ng như: kiểu trả

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); 
+0

Tôi hiểu sai lầm của tôi về phần này ngay bây giờ. Nhưng sau khi thực hiện những thay đổi đó, tôi nhận được "Người dùng của biến cục bộ chưa được gán" OrdersPerHour 'tại dòng trả về. – MaylorTaylor

+1

@MaylorTaylor Thay đổi 'int? OrdersPerHour;' to 'int OrdersPerHour = 0;', nên cẩn thận. –

+0

OK mà cố định tôi ngay lập tức, tuy nhiên, bây giờ tôi đang nhận được một vấn đề khác http://stackoverflow.com/questions/16744510/executescalar-always-returns-0 – MaylorTaylor

0

của phương pháp của bạn là int và bạn đang cố gắng để trả lại một int?.

1

Bạn có thể thay đổi dòng cuối cùng để sau (giả sử bạn muốn quay trở lại 0 khi không có gì trong db là):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value; 
0

Vấn đề đầu tiên gặp phải với mã của bạn là sứ điệp

Biến địa phương OrdersPerHour có thể không được khởi tạo trước khi truy cập.

Điều này xảy ra vì trong trường hợp truy vấn cơ sở dữ liệu của bạn sẽ ném ngoại lệ, giá trị có thể không được đặt thành thứ gì đó (bạn có mệnh đề bắt trống).

Để sửa lỗi này, thiết lập giá trị với những gì bạn muốn có nếu truy vấn thất bại, mà có lẽ 0:

int? OrdersPerHour = 0;

Một khi điều này là cố định, bây giờ có lỗi bạn đăng bài về. Điều này xảy ra vì chữ ký phương thức của bạn tuyên bố rằng bạn đang trả về một số int, nhưng thực ra bạn trả về một biến int vô giá, int?.

Vì vậy, để có được những int phần của int? của bạn, bạn có thể sử dụng .Value tài sản:

return OrdersPerHour.Value; 

Tuy nhiên, nếu bạn tuyên bố OrdersPerHour của bạn sẽ được null lúc khởi động thay vì 0, giá trị có thể được null nên một xác nhận hợp lệ trước khi trở về có lẽ là cần thiết (Ví dụ: ném một ngoại lệ cụ thể hơn).

Để làm như vậy, bạn có thể sử dụng HasValue tài sản để chắc chắn rằng bạn đang có một giá trị trước khi trở về nó:

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

Là một mặt lưu ý, vì bạn đang mã hóa trong C# nó sẽ tốt hơn nếu bạn theo các quy ước của C#.Tham số và biến của bạn phải ở trong camelCase, không phải là PascalCase. Vì vậy, UserOrdersPerHour sẽ là userordersPerHour.

11

điều này là do kiểu trả về của phương thức của bạn là int và OrdersPerHour là int? (Nullable), bạn có thể giải quyết việc này bằng cách trả lại giá trị của nó như dưới đây:

return OrdersPerHour.Value 

cũng kiểm tra nếu nó không phải là null để tránh ngoại lệ như như dưới đây:

if(OrdersPerHour != null) 
{ 

    return OrdersPerHour.Value; 

} 
else 
{ 

    return 0; // depends on your choice 

} 

nhưng trong trường hợp này bạn sẽ phải trả về một số giá trị khác trong phần khác hoặc sau phần nếu trình biên dịch khác sẽ đánh dấu một lỗi mà không phải tất cả các đường dẫn của giá trị trả về mã.

1

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

Tuyên bố này phải được nhập như, OrdersPerHour = (int)dbcommand.ExecuteScalar();

5
Int32 OrdersPerHour = 0; 
OrdersPerHour = Convert.ToInt32(dbcommand.ExecuteScalar()); 
0

đơn giản

(i == null) ? i.Value : 0; 
+1

Trong khi điều này về mặt lý thuyết có thể làm việc, nó không giải thích nó hoạt động như thế nào Nói "đơn giản" là không thực sự đủ –

+2

.. Nó ** chắc chắn ** sẽ không hoạt động. Bạn có một 'NullReferenceException' khi' i == null' và trả về '0' khi nó không phải là . –

0

Nếu bạn lo ngại với khả năng giá trị null Đổi lại, bạn cũng có thể chạy một cái gì đó như thế này:

Bằng cách này, bạn sẽ xử lý các kết quả không mong muốn tiềm ẩn và cũng có thể cung cấp giá trị mặc định cho biểu thức, bằng cách nhập .GetValueOrDefault(-1) hoặc điều gì đó có ý nghĩa hơn cho bạn.

Các vấn đề liên quan