Sign in with Microsoft
Sign in or create an account.

關於作者:

本文由微軟最有價值專 MVP 郭家齊提供。微軟十分感謝 MVP 主動地將他們的經驗與上百萬名其他技術使用者交流。MVP 郭家齊 同時也將此篇文章放在他的部落格內,歡迎您按 此處  瀏覽 MVP 郭家齊 更多的技術文章、經驗分享與觀點。

問題的來龍去脈

在 C# 中去得讀取 Oracle 內預存程序的回傳值,其回傳值的型別為 Long Type,但是,不管怎樣在 C# 中取到的值一律顯示為 Null。

問題的發生原因

透過 ADO.NET 撰寫與 DB 溝通方式如下:

OracleDatabase db = new OracleDatabase(........);
string sql = "select XXX from FND_FLEX_VALIDATION_TABLES where FLEX_VALUE_SET_ID=''XXX' '";
DataSet ds = new DataSet();
using (DbCommand cmd = db.GetSqlStringCommand(sql))
{
ds = db.ExecuteDataSet(cmd);
return ds.Tables[0].Rows[0][0].ToString();
}

但是,無論怎樣做法得到的 Datatable 一律皆為 Null,通常這不會是 SQL 語法問題,主要是在型別定義上,.NET 與 Oracle 是有所差異的

其原因如下:


問題的解決方法

1.Oracle command 中的 InitialLONGFetchSize 屬性預設值造成的。
2.設定 InitialLONGFetchSize 屬性,預設為 0,其意思為不抓取 Long Type 的資料。
3.設定要抓取 Long Type 的大小或是設定為 -1 表示不限定長度都可以取得資料。
4 加上((Oracle.DataAccess.Client.OracleCommand)cmd).InitialLONGFetchSize = -1 就可以。

修改後如下:

OracleDatabase db = new OracleDatabase(........);
string sql = "select XXX from FND_FLEX_VALIDATION_TABLES where FLEX_VALUE_SET_ID=''XXX' '";
DataSet ds = new DataSet();
using (DbCommand cmd = db.GetSqlStringCommand(sql))
{
((Oracle.DataAccess.Client.OracleCommand)cmd).InitialLONGFetchSize = -1;

ds = db.ExecuteDataSet(cmd);
return ds.Tables[0].Rows[0][0].ToString();
}  


請讓我們知道

還滿意我們寫的內容嗎?無論您是遇到了以下任何一種情況:
「太好了!問題解決了。」
「問題沒有解決,我有更好的建議。」
都歡迎您利用本篇文章底部的意見調查表,寫下您寶貴的意見。也期待您的鼓勵,讓我們為您創造更多實用的技術文章。

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

您對語言品質的滿意度如何?
以下何者是您會在意的事項?

感謝您的意見反應!

×