2009-07-22 109 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)成功(即使當值在正確的範圍內) 。