对Informix Serial和BigInt数据类型的ODBC支持
问题描述:
我在服务器上安装了Informix Dynamic Server 11.50和Informix Client SDK 3.5。我正在开发一个.NET应用程序,使用ODBC函数从Informix数据库读取数据。对Informix Serial和BigInt数据类型的ODBC支持
在数据库中,我有一个表中定义了Serial和BigInt数据类型的列。我的数据检索功能看起来像这样。
Dim cmd As New Odbc.OdbcCommand
Dim da As New Odbc.OdbcDataAdapter
Dim ds As New DataSet
Dim sb As New StringBuilder("")
Try
Using cn As New Odbc.OdbcConnection(ConfigurationSettings.AppSettings("connString"))
cn.Open()
sb.Append("SELECT * FROM InterfaceSP ")
sb.Append("join Interface on InterfaceSP.InterfaceID = Interface.InterfaceID ")
sb.Append("left join InterfaceSPAction on InterfaceSP.InterfaceSPID = InterfaceSPAction.InterfaceSPID and action_status = 'ACTV' ")
sb.Append(" WHERE InterfaceSP.InterfaceID = ? ")
sb.Append(" ORDER BY InterfaceSP.SPName")
cmd.Connection = cn
cmd.CommandType = CommandType.Text
cmd.CommandText = sb.ToString
cmd.Parameters.AddWithValue("@InterfaceID", strInterfaceID)
da.SelectCommand = cmd
da.Fill(ds, "InterfaceSPList")
End Using
Return ds
Catch ex As Exception
Throw ex
End Try
最终结果数据集将被传递给数据网格对象。问题是.NET在加载数据网格时会引发异常。
Unknown SQL type - -114.
[ArgumentException: Unknown SQL type - -114.]
我试着修改串行和BigInt数据类型的列到整数。而且,一切工作正常,无需修改一行代码。
我确实需要一些建议如何克服这个问题,因为我需要串行数据类型列作为增量id列。对于BigInt数据类型列,可能我们可以将其更改为具有Integer数据类型的列。
欢迎任何建议。
答
.NET“知道”一组有限的数据类型。从各种数据源检索数据的.NET数据提供者必须将各种数据类型转换为.NET能够识别的东西。 ODBC .NET数据提供程序内置了一定数量的识别类型。除此之外的任何内容都可能导致错误。
为了解决这个问题,我怀疑你可以在你运行的SQL SELECT语句中强制转换数据类型。我对Informix并不熟悉,但是使用一些简单的Google搜索似乎表明,使用此格式columnname::newtype
可以完成演员阵容。因此,您需要将SELECT语句中的*
替换为特定字段,然后将有问题的列转换为可识别的类型,例如整数:SerialCol::Integer
。 (我猜这个类型)。
答
需要看看你的CLIENT_locale和你连接字符串的DB_locale设置
谢谢,朋友!我必须将所有具有Serial和BigInt数据类型的列都转换为Integer,以便它可以工作。这意味着我现在有很多工作要做。唉...... – poh 2010-01-20 08:17:29
@poh:我只是做了一些搜索,看起来有一个本地的Informix .NET数据提供程序(http://publib.boulder.ibm.com/infocenter/idshelp/v10/index .JSP?主题=/com.ibm.relnotes.doc/300xc2/netrel.html)。这几乎肯定会消除像这样的数据类型的问题。我专注于回答问题而不是解决问题。 – 2010-01-20 12:52:29