2010年4月13日 星期二

ORA-01460 unimplemented or unreasonable conversion requested

為了這個問題,搞了一天了,特此紀錄一下,也當作自己的 KM 吧!




WEB:Windows Server 2003 SP 2
DB:Oracle 10g
Data Provider:Oracle Client 10.02.00.03
Language:Asp .Net with C#
直接使用SqlDataSource的UpdateCommand功能透過StoreProcedure更新資料

網路上找到的資料大部分都是因為CLOB欄位型態而引起,可參考這篇:
LazyAssCoder, Dec 05, 2007
VB.NET: Error: System.Data.OracleClient.OracleException: ORA-01460: unimplemented or unreasonable conversion requested

但是我們又沒有用過這個型態,所以繼續查,Oracle Support中則是有其他資訊
描述中提到
This is a server side OCI issue caused when using a rebind of the same cursor.
詳細資訊可搜尋 Oracle Support

可是因為環境又不能隨便上Patch
所以決定土法煉鋼,一步一步測試。
利用OnUpdating顯示Parameters確認資料都有之後,
先建立一個空的StoreProcedure,僅接參數但不作任何事。
結果...一樣。


後來用一個測試的Table,讓UpdateCommand去Update它,
然後在OnUpdating裡面用DbCommand重新寫一段程式去呼叫StoreProcedure,
隨便亂試之後,出現了另外一個錯誤訊息:
ORA-01461: can bind a LONG value only for insert into a LONG column.
把其中一個變數的長度顯示出來,發現有 3199 個字元
可是 Oracle 的 VarChar2 可以到 4000 呀!
突然想到之前 9i 轉 10g 有遇到類似欄位型態要轉換的問題
所以調整了一下,在OnUpdating將Parameters的DbType改為AnsiString就好了!
.aspx 部份


<asp:SqlDataSource ID="SqlDataSource1" runat="server" .....
UpdateCommand="[StoreProcedureName]" UpdateCommandType="storedProcedure"
OnUpdating="ConvertUpdateDBTypeValue">
<UpdateParameters>
<asp:Parameters.....
..........


.aspx.cs 部份


protected void ConvertUpdateDBTypeValue(Object source, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["[ParameterName]"].DbType = DbType.AnsiString;
}






沒有留言: