【问题标题】:Oracle.ManagedDataAccess.Client.OracleException - ORA-01722: invalid numberOracle.ManagedDataAccess.Client.OracleException - ORA-01722: 无效号码
【发布时间】:2014-11-27 18:42:52
【问题描述】:

我在 .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 时,它工作得很好

发生了什么? 声明中没有任何强制转换。我一定在这里遗漏了一些明显的东西。

【问题讨论】:

    标签: c# oracle oracle11g datacontext


    【解决方案1】:

    您不能以这种方式传入参数。当你这样做时,它会将 SQL 呈现为如下所示:

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

    这将尝试将值作为单个字符串转换为数字。相反,您可以:

    • 使用表值参数将值作为数组传递。我以前没有这样做过,但很确定这是可能的,例如How to use Array/Table Parameter to Oracle (ODP.NET 10g) via ADO.NET/C#?)
    • 忘记使用参数并使用字符串连接。通常不是一个好主意(SQL 注入等),但做起来很简单。要使用 RegEx 验证输入(并假设您在数字之间没有任何空格),您可以使用它来匹配输入(根据@LIUFA 的评论稍作修改):^[0-9][\,0-9]*$

    【讨论】:

    • 你真是个天才!它适用于string.Format。谢谢。
    • 哈哈,谢谢!请小心验证字符串,因为它似乎是从公开可见的操作方法中获取的,这意味着人们可以轻松执行 SQL 注入。
    • 选项 2。如果有人需要这里的正则表达式来清理输入 new Regex(@"[0-9][\,0-9]*").Match(id).Value;。大卫,如果您可以在选项二下复制正则表达式,那就太好了,因为任何选择它的人都必须执行此步骤。
    • 所以您不想处理输入中的空格?例如1, 2, 3, 4?
    • 另外,我个人只会使用 RegEx 来验证而不是清理。我会将其添加到我的答案中。
    猜你喜欢
    • 2019-08-09
    • 2023-03-15
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2012-09-14
    相关资源
    最近更新 更多