【发布时间】:2011-03-04 01:43:26
【问题描述】:
我正在从 SQL Server 表中读取一行。其中一列是 tinyint 类型。
我想将值放入 int 或 int32 变量中。
rdr.GetByte(j)
(byte) rdr.GetValue(j)
...似乎是检索值的唯一方法。但是如何将结果放入 int 变量中?
【问题讨论】:
标签: c# .net sql-server
我正在从 SQL Server 表中读取一行。其中一列是 tinyint 类型。
我想将值放入 int 或 int32 变量中。
rdr.GetByte(j)
(byte) rdr.GetValue(j)
...似乎是检索值的唯一方法。但是如何将结果放入 int 变量中?
【问题讨论】:
标签: c# .net sql-server
int value = rdr.GetByte(j);
不需要显式转换,因为 byte 到 int 是一种扩大转换(不会丢失数据)。
【讨论】:
byte 到 int 的隐式转换
GetByte 内部。
j 列不是byte。试试int value = Convert.ToInt(rdr.GetValue(j));
将字节转换为 int 应该可以正常工作:
int myInt = (int) rdr.GetByte(j);
由于C# supports implicit conversions from byte to int,您也可以这样做:
int myInt = rdr.GetByte(j);
您选择哪一个是一个偏好问题(您是否想记录演员阵容正在发生的事实)。请注意,如果要使用 type inference,则需要显式转换,否则 myInt 将具有错误的类型:
var myInt = (int) rdr.GetByte(j);
【讨论】:
(int)rdr.GetByte(j)
【讨论】:
请参阅BitConverter.ToInt32 的文档(包含更多示例):
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
【讨论】:
byte 转换为int。 BitConverter 处理 bytes 的数组,而不是单个 bytes。
将byte 分配给int 有效:
int myInt = myByte;
但也许你得到一个异常inside IDataRecord.GetByte,在这种情况下你应该检查你用来访问数据记录的索引是否真的指向tinyint 列。您可以检查从GetValue 返回的类型。对于tinyint 列,它应该是byte。
Trace.Assert(rdr.GetValue(j).GetType() == typeof(byte));
另一种选择是完全放弃脆弱的数字索引:
int myInt = rdr.GetByte(rdr.GetOrdinal(TheNameOfTheTinyintColumn))
【讨论】:
这类似于 Stephen Cleary 对已接受答案的评论,但是我需要指定 int 的大小。这对我有用:
int value = Convert.ToInt32(rdr.GetValue(j));
(而且它还提供了与使用 int 的数据库列的向后兼容性。)
【讨论】:
我作为一种极端情况遇到的快速花絮。如果您有一个类型为 System.Byte 的对象类型,则不能直接转换为 int。您必须先转换为字节,然后再转换为 int。
public int Method(object myByte)
{
// will throw a cast exception
// var val = (int)myInt;
// will not throw a cast exception
var val = (int)((byte)myInt)
return val;
}
Method((byte)1);
【讨论】: