簡體   English   中英

Oracle.ManagedDataAccess.Client.OracleException-ORA-01722:無效的數字

[英]Oracle.ManagedDataAccess.Client.OracleException - ORA-01722: invalid number

我正在.NET 4.5 C#,oracle 11g環境中工作。

當我使用datacontext從代碼中調用以下SQL語句時,我遇到了特殊的行為

我收到ORA-01722: invalid number

在此處輸入圖片說明

堆棧跟蹤:

   at Corp.DataServices.ExecuteQueryHandler.HandleQueryException(Exception exception) in c:\dev\CCTech Main\Corp\Corp.Conveyancing.DataServices\FluentData.cs:line 4022
   at Corp.DataServices.ExecuteQueryHandler.ExecuteQuery(Boolean useReader, Action action) in c:\dev\CCTech Main\Corp\Corp.Conveyancing.DataServices\FluentData.cs:line 3993
   at Corp.DataServices.DbCommand.QueryMany[TEntity,TList](Action`2 customMapper) in c:\dev\CCTech Main\Corp\Corp.Conveyancing.DataServices\FluentData.cs:line 3857
   at Corp.DataServices.DbCommand.QueryMany[TEntity](Action`2 customMapper) in c:\dev\CCTech Main\Corp\Corp.Conveyancing.DataServices\FluentData.cs:line 3882
   at Corp.Dashboard.Controllers.HomeController.GetInstructionsJson(String id) in c:\dev\CCTech Main\Corp\Corp.Conveyancing.Dashboard\Controllers\HomeController.cs:line 65
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult, Object tag)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass48.<InvokeActionMethodFilterAsynchronouslyRecursive>b__41()

現在到特殊的部分。
當我直接從PL / SQL執行完全相同的sql時,效果很好
在此處輸入圖片說明

到底是怎么回事? 語句中沒有任何強制轉換。 我一定會在這里遺漏一些明顯的東西。

您不能以這種方式傳遞參數。 當您這樣做時,它將把SQL渲染成這樣:

WHERE productid IN ('1,2,3,4,5')

它將嘗試將值作為單個字符串轉換為數字。 相反,您可以:

  • 使用表值參數將值作為數組傳遞。 我之前沒有做過,但是非常確定這是可能的,例如, 如何通過ADO.NET/C#將數組/表參數用於Oracle(ODP.NET 10g)?
  • 忘記使用參數並使用字符串連接。 通常這不是一個好主意(SQL注入等),但操作簡單。 要使用RegEx驗證輸入(並假設數字之間沒有空格),可以使用它來匹配輸入(通過@LIUFA從注釋中稍作修改): ^[0-9][\\,0-9]*$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM