2009-07-23 29 views
17

Tôi có một truy vấn SQL trả về chỉ một trường - một ID của loại INT.Int32.TryParse() hoặc (int?) Command.ExecuteScalar()

Và tôi phải sử dụng nó làm số nguyên trong mã C#.

Cách nào nhanh hơn và sử dụng ít bộ nhớ hơn?

hoặc

int? id = (int?)command.ExecuteScalar(); 
if(id.HasValue) 
{ 
    // use id.Value 
} 

hoặc

int? id = command.ExecuteScalar() as int?; 
if(id.HasValue) 
{ 
    // use id.Value 
} 
+1

Tôi biết điều này là cũ, nhưng có liên quan Donald Knuth trích dẫn: "Người lập trình lãng phí một lượng lớn thời gian suy nghĩ hoặc lo lắng về tốc độ của các phần không quan trọng trong chương trình của họ. Chúng ta nên quên đi hiệu quả nhỏ, khoảng 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi điều ác. Tuy nhiên, chúng ta không nên bỏ qua cơ hội của chúng ta trong 3% quan trọng đó. " –

+0

Hey @DannyNeumann, nói chung, tôi không nghĩ rằng nó làm cho nhiều ý nghĩa để đăng nó ở đây vì nó là một câu hỏi từ năm 2009. Đặc biệt, viết mã hiệu quả vẫn còn quan trọng. Và đây là cách tôi học được để làm như vậy.Tôi hàng ngày thấy mã khủng khiếp, khủng khiếp mà sẽ phù hợp với báo giá của Knuth hoàn toàn tốt. Điều đó đang được nói, người ta không nên dành nhiều thời gian vào tối ưu hóa sớm của các phần không quan trọng, nhưng trong cùng một thời gian không nên viết các phần không quan trọng không hiệu quả. – abatishchev

Trả lời

22

Sự khác biệt giữa ba hiệu suất khôn ngoan là không đáng kể. Nút cổ chai đang di chuyển dữ liệu từ DB sang ứng dụng của bạn, chứ không phải là cuộc gọi phương thức hoặc phương thức tầm thường.

tôi sẽ đi với:

int? id = (int?)command.ExecuteScalar(); 
if(id.HasValue) 
{ 
    // use id.Value 
} 

thất bại trước, nếu mọi người một ngày thay đổi lệnh để trả lại một chuỗi hoặc một ngày, ít nhất nó sẽ sụp đổ và bạn sẽ có một cơ hội để sửa chữa nó.

Tôi cũng sẽ chỉ cần đơn giản int truyền IF Tôi luôn mong đợi lệnh trả về một kết quả. Lưu ý, tôi thường thích trả về một tham số ngoài việc thực hiện vô hướng thực thi, thực thi vô hướng cảm thấy mong manh (quy ước rằng cột đầu tiên trong hàng đầu tiên là giá trị trả về không đúng cho tôi).

+0

ExecuteScalar() là một thắng lợi lớn trong vb, nơi bạn có thể thực hiện một CInt() hoặc CStr() trên đó. –

2

Sau đó. Convert.ToInt32() cũng là một tùy chọn.

+1

Phương pháp đầu tiên là từ Satan vì nhiều lý do. Nó chậm hơn và ít dễ đọc hơn. Kinh quá. –

+0

Convert.ToInt32() làm việc cho tôi trong khi một diễn viên sẽ không, với lệnh.ExecuteScalar(); – JYelton

1

Sử dụng id.HasValue cho tối đa Nullable Type cool-factor!

19

Nếu bạn mong đợi lệnh trả về null, bạn nên nhớ rằng cơ sở dữ liệu rỗng (DBNull) không giống với .NET null. Vậy, chuyển đổi DBNull thành int? Sẽ thất bại.

tôi muốn đề nghị như sau:

object result = command.ExecuteScalar(); 
int? id = (int?)(!Convert.IsDBNull(result) ? result : null); 
+2

Hãy nhớ rằng nếu thực hiện vô hướng trả về không có hàng, bạn sẽ nhận được một giá trị rỗng. Bạn là chính xác rằng nếu hàng đầu tiên trong cột đầu tiên là null bạn có thể gặp rắc rối. –

+1

nhưng sau đó một lần nữa nó và ID (tôi ít nhất là đọc đó là nhận dạng/khóa) để DBNull không phải là một vấn đề –

+0

@Sam Saffron, đã đồng ý về hàng trống. @Rune FS, chúng tôi không biết logic cơ bản ở đây. Tôi sẽ không cho rằng một truy vấn có thể trả về null hay không, chỉ dựa trên một tên biến. – VladV

5

Nếu không ai trong số các công trình trên (đặc biệt là cho những người dùng đang chiến đấu với MySQL) lý do tại sao bạn không thử những điều sau đây?

int id = Convert.ToInt32(cmd.ExecuteScalar().ToString()); 
2
int Result = int.Parse(Command.ExecuteScalar().ToString()); 

sẽ làm việc trong C#.

+2

Đó là một cách tiếp cận xấu đầu tiên đổ vào chuỗi sau đó để phân tích cú pháp khi đối tượng nó đã là một int, nó chỉ đòi hỏi phải được đúc. – abatishchev

-2
if ((Int32)cmd.ExecuteScalar() ** 1) //en esta parece qu esta el error pero no lo veo 
{ 
    Response.Redirect("Default.aspx"); 
} 
else 
{ 
    Response.Redirect("error.htm") ; 
} 
+1

Đây có phải là câu trả lời không? Hay bạn đang cố gắng để được giúp đỡ? Bởi vì bình luận của người Tây Ban Nha có nghĩa là * 'Có vẻ như lỗi ở đây nhưng tôi không thể nhìn thấy nó' * – brasofilo

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