将字节作为 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 位无符号整数。更好的等价物是 Int16Short,它是一个 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*

使用 Dllimport 将一个非常大的字符串作为字节数组从 C++ 传递到 C#

从 C++ 将字节数组传递给 lua 脚本方法

将字节数组传递给 oracle 存储过程

将字节数组从 C 传递到 Lua

Mysql详解