将字节作为 SmallInt 传递?
Posted
技术标签:
【中文标题】将字节作为 SmallInt 传递?【英文标题】:Pass Byte as SmallInt? 【发布时间】:2011-05-16 15:48:27 【问题描述】:我有一个 Informix 存储过程,它接受一个 int 和一个“smallint”作为参数。我正在尝试从 .net4 Visual Basic 程序调用此 SP。
据我所知,“smallint”是一个字节。不幸的是,当加载带有整数和字节的 IfxCommand.Parameters 集合时,我得到了 "The parameter data type of Byte is invalid."
引发的 ArgumentException,并带有以下堆栈跟踪:
在 IBM.Data.Informix.TypeMap.FromObjectType(类型数据类型,Int32 长度) 在 IBM.Data.Informix.TypeMap.FromObjectType(类型数据类型) 在 IBM.Data.Informix.IfxParameter.GetTypeMap() 在 IBM.Data.Informix.IfxParameter.GetOutputValue(IntPtr stmt,CNativeBuffer valueBuffer,CNativeBuffer lenIndBuffer) 在 IBM.Data.Informix.IfxDataReader.Dispose(布尔处理) 在 IBM.Data.Informix.IfxDataReader.System.IDisposable.Dispose() 在 IBM.Data.Informix.IfxCommand.ExecuteReaderObject(CommandBehavior 行为,字符串方法) 在 IBM.Data.Informix.IfxCommand.ExecuteReader(CommandBehavior 行为) 在 IBM.Data.Informix.IfxCommand.ExecuteReader()
大概我需要以某种方式将我必须的字节转换为 smallint,但谷歌目前没有给我任何相关的答案。
我尝试过使用:
cmd.Parameters.Add(New IfxParameter("myVal", IBM.Data.Informix.IfxType.SmallInt)).Value = myByte
但我在执行阅读器时仍然得到相同的 ArgumentException。
谁能告诉我我做错了什么?
【问题讨论】:
Byte
有点像UInt8,没有符号,你试过short
或者Int16
吗?
好吧,显然我公司中认为 Informix smallint 是一个字节的每个人都是错误的。我实际上并没有考虑过这种可能性......
回复:我之前的评论,请不要将我假设的 UInt8 与实际上更像 .Net Long 或 Int64 的 informix Int8 混淆,请不要忘记标记或投票给答案如果他们是对的。
【参考方案1】:
Informix SmallInt 是一个 16 位有符号整数,byte
是一个 8 位无符号整数。更好的等价物是 Int16
或 Short
,它是一个 16 位有符号整数,就像 SmallInt 一样。我怀疑这会起作用。
Informix 没有类似 .Net Byte
或 TSQL TinyInt
这样的无符号 8 位整数。
【讨论】:
【参考方案2】:Int16 应该可以工作,因为它的范围与 SmallInt 相同(-32,767 到 32,767)
【讨论】:
【参考方案3】:Informix 有 4 种相关类型:BYTE 和 TEXT(自 1990 年以来)、BLOB 和 CLOB(自 1996 年以来)。总的来说,它们都是大物体。 BYTE 类型绝对是 NOT 小整数类型。
如果语言或驱动程序修复了类型,您也许可以在认为它是小整数的语言中使用 BYTE。
但是原生 BYTE 类型是一个大对象。它需要在主数据行中有一个 56 字节的描述符,然后使用其他存储(可能是 IN TABLE,也可能在 blobspace 中)进行实际数据存储。
【讨论】:
以上是关于将字节作为 SmallInt 传递?的主要内容,如果未能解决你的问题,请参考以下文章
将字节数组从 C# 传递到 C++ DLL 作为 char*