2010-06-15 54 views
9

Tôi đang đọc một hàng từ bảng SQL Server. Một trong các cột là loại tinyint.Byte thành số nguyên trong C#

Tôi muốn lấy giá trị vào biến int hoặc int32.

rdr.GetByte(j) 
(byte) rdr.GetValue(j) 

... có vẻ là cách duy nhất để truy xuất giá trị. Nhưng làm thế nào để tôi nhận được kết quả vào biến số int?

Trả lời

17

int value = rdr.GetByte(j);

Một diễn viên rõ ràng là không cần thiết, bởi vì một byte để int là một chuyển đổi mở rộng (không có khả năng mất dữ liệu).

+1

T.B. Đây là một diễn viên ngầm 'byte' đến' int' – abatishchev

+3

Tôi nên cụ thể hơn. Đó là những gì tôi đã thử. Tôi nhận được một "dàn diễn viên được chỉ định là không hợp lệ." ngoại lệ. Tôi cũng đã thử: int value = (int) rdr.GetByte (j) và int value = Convert.ToInt (rdrGetByte (j)) – jtb

+1

@jtb: Dường như với tôi thì bạn không nhận được cột nhỏ xíu với chỉ số j.Dấu vết ngăn xếp ngoại lệ là gì? Lỗi phải xảy ra bên trong 'GetByte'. –

1

Đúc byte để int nên chỉ làm việc tốt:

int myInt = (int) rdr.GetByte(j); 

Kể từ C# supports implicit conversions from byte to int, bạn có thể cách khác chỉ làm điều này:

int myInt = rdr.GetByte(j); 

Mà một trong những bạn chọn là một vấn đề ưu tiên (cho dù bạn muốn ghi lại thực tế là một diễn viên đang diễn ra hay không). Lưu ý rằng bạn sẽ cần các diễn viên rõ ràng nếu bạn muốn sử dụng type inference, hoặc myInt sẽ có các loại sai:

var myInt = (int) rdr.GetByte(j); 
10

Xem tài liệu cho BitConverter.ToInt32 (chứa nhiều ví dụ):

byte[] bytes = { 0, 0, 0, 25 }; 

// If the system architecture is little-endian (that is, little end first), 
// reverse the byte array. 
if (BitConverter.IsLittleEndian) 
    Array.Reverse(bytes); 

int i = BitConverter.ToInt32(bytes, 0); 
Console.WriteLine("int: {0}", i); 
// Output: int: 25 
+1

Câu hỏi đặt ra là hỏi cách chuyển đổi một' byte' thành 'int'. 'BitConverter' xử lý các mảng' byte', không phải đơn 'byte'. –

+1

vẫn giúp tôi –

4

Gán một byte một int công trình:

int myInt = myByte; 

Nhưng có thể bạn đang nhận được một ngoại lệ bên trongIDataRecord.GetByte, trong trường hợp đó bạn nên kiểm tra xem chỉ mục bạn đang sử dụng để truy cập vào bản ghi dữ liệu thực sự trỏ đến cột tinyint hay không. Bạn có thể kiểm tra loại trả lại từ GetValue. Nó phải là một byte cho một cột tinyint.

Trace.Assert(rdr.GetValue(j).GetType() == typeof(byte)); 

lựa chọn khác là bỏ qua những chỉ số số mong manh hoàn toàn:

int myInt = rdr.GetByte(rdr.GetOrdinal(TheNameOfTheTinyintColumn)) 
0

này tương tự như bình luận Stephen Cleary về việc trả lời chấp nhận, tuy nhiên tôi cần thiết để xác định kích thước của int. Điều này làm việc cho tôi:

int value = Convert.ToInt32(rdr.GetValue(j)); 

(Và nó cũng cung cấp khả năng tương thích ngược với một cột cơ sở dữ liệu sử dụng một int.)

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