【问题标题】:Byte to integer in C#C#中的字节到整数
【发布时间】:2011-03-04 01:43:26
【问题描述】:

我正在从 SQL Server 表中读取一行。其中一列是 tinyint 类型。

我想将值放入 int 或 int32 变量中。

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

...似乎是检索值的唯一方法。但是如何将结果放入 int 变量中?

【问题讨论】:

    标签: c# .net sql-server


    【解决方案1】:

    int value = rdr.GetByte(j);

    不需要显式转换,因为 byteint 是一种扩大转换(不会丢失数据)。

    【讨论】:

    • P.S.这是 byteint 的隐式转换
    • 我应该更具体。这就是我已经尝试过的。我收到“指定的演员表无效”。例外。我也试过: int value = (int) rdr.GetByte(j) and int value = Convert.ToInt(rdrGetByte(j))
    • @jtb:在我看来,您没有得到索引为 j 的 tinyint 列。什么是异常堆栈跟踪?错误必须发生在 GetByte 内部。
    • 我同意@Jordao;听起来j 列不是byte。试试int value = Convert.ToInt(rdr.GetValue(j));
    【解决方案2】:

    将字节转换为 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);
    

    【讨论】:

      【解决方案3】:
      (int)rdr.GetByte(j)
      

      【讨论】:

        【解决方案4】:

        请参阅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 转换为intBitConverter 处理 bytes 的数组,而不是单个 bytes。
        【解决方案5】:

        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))
        

        【讨论】:

          【解决方案6】:

          这类似于 Stephen Cleary 对已接受答案的评论,但是我需要指定 int 的大小。这对我有用:

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

          (而且它还提供了与使用 int 的数据库列的向后兼容性。)

          【讨论】:

            【解决方案7】:

            我作为一种极端情况遇到的快速花絮。如果您有一个类型为 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);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-07-10
              • 1970-01-01
              • 2012-11-03
              • 2012-04-10
              • 2019-02-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多