【问题标题】:dapper with oracle view具有甲骨文视图的小巧玲珑
【发布时间】:2022-08-18 17:26:59
【问题描述】:

我正在努力使用 Dapper 仅从视图中选择查询,该视图是从 sql developerper 手动创建的,并且在测试和生产中都可以正常工作。 但是当我在 Windows 服务器上发布应用程序时,我收到了这个错误:

ORA-01858: A non-numeric character was found where a numeric was expected

下面是我的班级定义:

public class rib_model_new
{
    public int ID { get; set; }
    public string CUST_AC_NO { get; set; }
    public string AC_DESC { get; set; }
    public string CUST_NO { get; set; }
    public string AC_OPEN_DATE { get; set; }
    public string CUSTOMER_PREFIX { get; set; }
    public string E_MAIL { get; set; }
    public string ACY_CURR_BALANCE { get; set; }
    public string MOBILE_NUMBER { get; set; }
}

这是我使用 dapper 的代码:

var cmdDef = new CommandDefinition(\"select * from COMPTE_OPEN_NEW_2 where AC_OPEN_DATE=\'19-aug-22\'\",commandType: CommandType.Text, flags: CommandFlags.NoCache);
                rib_models = await objconn.QueryAsync<rib_model_new>(cmdDef);

贝娄是我的视图定义:

CREATE OR REPLACE VIEW COMPTE_OPEN_NEW_2 AS SELECT c.customer_prefix, cust_ac_no,cust_no, ac_desc, AC_OPEN_DATE,acy_curr_balance, c.e_mail, c.mobile_number FROM FCUBSLIVE.STTM_CUST_ACCOUNT a,FCUBSLIVE.sttm_customer d, FCUBSLIVE.sttm_cust_personal c WHERE a.auth_stat = \'A\' and a.cust_no = d.customer_no and d.customer_no = c.customer_no AND a.record_stat = \'O\';

这是从我的代码运行的查询及其从 sql 开发人员的工作:

select * from COMPTE_OPEN_NEW_2 where ac_open_date=\'17-aug-22\'

最后这张图片显示了我的视图数据类型:

从堆栈跟踪:

    at OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution(Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, SqlStatementType sqlStatementType, Int32 arrayBindCount, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
   at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Int64& internalInitialLOBFS, Int64 internalInitialJSONFS, OracleException& exceptionForArrayBindDML, OracleConnection connection, IEnumerable`1 adrianParsedStmt, Boolean isDescribeOnly, Boolean isFromEF)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
--- End of stack trace from previous location ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Dapper.SqlMapper.<QueryAsync>d__33`1.MoveNext() in /_/Dapper/SqlMapper.Async.cs:line 418
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at CheckbookHangfire.Services.Services_Flexcube_Test.<GetAccountsCreated_new>d__18.MoveNext() in C:\\Users\\Administrator\\source\\repos\\CheckbookHangfire\\CheckbookHangfire\\Services\\Services_Flexcube_Test.cs:line 318

从这个 Trace 我试图理解这个错误:

 at Dapper.SqlMapper.<QueryAsync>d__33`1.MoveNext() in /_/Dapper/SqlMapper.Async.cs:line 418

请问这是什么意思,dapper在这里做什么,他不能将结果映射到我的模型。 我的所有模型字段与查询结果列具有相同的名称。

有人可以帮忙吗?

此致...

  • 您应该发布视图定义,包括列类型。还有你要绑定的 C# 类型的定义,以及你用来查询的代码行。错误本身看起来很清楚。但是我们需要看到所有事物的定义才能确定。
  • 您好@mason,我已经更新了请求。
  • 您仍然没有显示 C# 类定义或您用于使用 Dapper 查询的代码。
  • 你好@mason我已经更新了请求请

标签: c# asp.net-core dapper


【解决方案1】:

看起来这是您的日期格式。认为所有服务器都同意“19-aug-22”是非常冒昧的。将代码更改为:

var cmdDef = new CommandDefinition("select * from COMPTE_OPEN_NEW_2 where AC_OPEN_DATE=:openDate",commandType: CommandType.Text, flags: CommandFlags.NoCache,
new { openDate = new Datetime(2022,8,19)});
rib_models = await objconn.QueryAsync<rib_model_new>(cmdDef);

当你问自己:“我应该使用参数化查询而不是直接在 SQL 中添加参数吗?”,答案总是肯定的。

【讨论】:

  • 您好@Palle Due 感谢您的回复,我正在使用这样的文化:string result = DateTime.Today.ToString(date_format, CultureInfo.InvariantCulture); date_format 来自 appseting 文件,如下所示:“format”:“dd-MMM-yy”,但让我试试这个并提供反馈
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
相关资源
最近更新 更多