2009-07-22 122 views
2

我们正在开发一个将其数据存储在数据库中的独立应用程序。我们使用数据集和TableAdapters与数据库进行通信。其中一个基本要求是应用程序能够使用SQL Server,Oracle和MySQL。为此,我们使助教供应商中的查询独立。我们使用ODBC提供程序。Oracle NUMBER问题:将十进制转换为Int64转换

它适用于SQL Server和MySQL,但对于Oracle我们有问题。我们无法克服的其中一个问题是十进制到Int64的转换错误。

Oracle表使用的系统ID(自动增量字段),因为它似乎被映射到十进制数(38)。但是,我们在DataSet/TA中使用Int64/long,因为SQL Server和MySQL使用BIGINT。 (请注意,该数据集的TableAdapter从一开始就SQL Server架构,其中自动生成的。)

我们正从甲骨文一个数值时,因为它返回一个小数对象中获取转换异常。

DbCommand getIDcmd = connection.CreateCommand(); 
getIDcmd.CommandText = "select LAST_ID from SEQUENCE_ID"; 
sequenceID = (Int64)getIDcmd.ExecuteScalar(); // we get a cast exception here returns decimal 

请注意,我们一直试图降低在Oracle中精度数(例如NUMBER(10))为我们与其他论坛条目,但没有运气看到。

这是一个ODBC问题吗?如果我们转移到其他提供商将解决问题?

回答

1

如果sequence_id是你的序列的查询看起来不正确Oracle中的名称。你会查询最后给定的ID与查询如下:

SELECT last_number FROM all_sequences WHERE sequence_owner=? AND sequence_name=? 

演员不应该是一个问题(如果在int64范围内)。

1

你可以运行此找出实际返回什么类型,然后从那里:

System.Windows.Forms.MessageBox.Show(getIDcmd.ExecuteScalar().GetType().ToString()); 
1

好像此查询总是返回一个'小数”。你可以试试这个:

sequenceID = Convert.ToInt64(getIDcmd.ExecuteScalar()); 

我不认为你的情况会发生任何精度损失。

注意降低你的号码的精度始终是一个好主意:Int64映射到NUMBER(19)。 这不会解决您手头的问题,但它可能会阻止将来出现更多问题。举例来说,如果你得到一个IDataRecord包括您的ID(使用Microsoft Oracle提供),以GetInt64通话将失败时,你的列被定义为NUMBER(38)当定义为NUMBER(19)成功(即使当值在正确的范围内) 。