ASP.NET Core Web API - 如何解决 ORA-01821:无法识别日期格式

问题描述 投票:0回答:1

我正在尝试使用 Dapper 使用 ASP.NET Core Web API 检索 Oracle DB 中的记录。所以我尝试按降序对 DB_IN_TIME 进行排序。

[ERR] 按事务参考号记录:Oracle.ManagedDataAccess.Client.OracleException (0x80004005):ORA-01821:无法识别日期格式。

它指向:

var checkReversals = await _dbConnectionAsync.QueryAsync<IncomingIsoAutoReversalDto>(query, new
{
    TRN_REF_NO = requestDto.TransactionRefNo
});

准确地说:

传入IsoAutoReversalDto

注意:

在 Oracle DB 中,DB_IN_TIME 以 VARCHAR2 形式给出,它是一个字符串,如下所示: 2024:28:02 12:29:25.220997 我认为是:(YYYY:DD:MM HH:MI:SS.FFFFFF),但你可以将其转换为常规的

请帮忙解决。

主要代码:

public async Task<Response<IEnumerable<IncomingIsoAutoReversalDto>>> CheckReversalsByTranRefAsync(ReversedTransactionRequestDto requestDto)
{
    var response = new Response<IEnumerable<IncomingIsoAutoReversalDto>>();
    try
    {
        using (var _dbConnectionAsync = new OracleConnection(_configuration.GetConnectionString("DefaultConnection")))
        {
            try
            {
                await _dbConnectionAsync.OpenAsync();
                _logger.Information("Database connection successful.");
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Failed to establish database connection.");
            }

            var query = @"
               SELECT P_KEY AS PKey,
                        PAN AS Pan,
                        PROC_CODE AS ProcCode,
                        MSG_TYPE AS MsgType, 
                        STAN AS Stan,
                        RESP_CODE AS ResponseCode,
                        TXN_CCY_CODE TransactionCurrencyCode, 
                        SETL_CCY_CODE SettlementCurrencyCode, 
                        RRN AS RetrievalRefNo,
                        BILL_AMT AS BillAmount,
                        TO_DATE(DB_IN_TIME, 'YYYY:DD:MM HH24:MI:SS.FF') AS TransactionDate,
                        TRN_REF_NO AS TransactionRefNo, 
                        WORK_PROGRESS AS TransactionStatus,
                        FROM_ACC AS DebitAccountNumber,
                        TERM_ID AS TermId,
                        TXN_AMT AS TransactionAmount,
                        SETL_AMT AS SettlementAmount,
                        TXN_DESC AS TransactionDescription,
                        TERM_ADDR AS TermAddress
                        FROM (
                            SELECT * FROM SWTB_TXN_LOG
                            WHERE MSG_TYPE IN ('0100', '0200', '0220','0420', '0400')
                            AND TRN_REF_NO = :TRN_REF_NO
                            UNION ALL
                            SELECT * FROM SWTB_TXN_HIST
                            WHERE MSG_TYPE IN ('0100', '0200', '0220','0420', '0400')
                            AND TRN_REF_NO = :TRN_REF_NO
                        ) SWTB_TXN
                        ORDER BY CASE WHEN MSG_TYPE IN ('0100', '0200', '0220') AND WORK_PROGRESS = 'S' THEN TO_DATE(DB_IN_TIME, 'YYYY:DD:MM HH24:MI:SS.FF') END DESC NULLS LAST
                        FETCH FIRST 1 ROWS ONLY";

            var checkReversals = await _dbConnectionAsync.QueryAsync<IncomingIsoAutoReversalDto>(query, new
            {
                TRN_REF_NO = requestDto.TransactionRefNo
            });

            if (checkReversals == null || !checkReversals.Any())
            {
                response.Message = "Data Not Found!";
                response.Successful = false;
                response.StatusCode = (int)HttpStatusCode.NotFound;
                return response;
            }

            var mappedTransactions = await TransformTransactionsAsync(checkReversals);

            response.Data = mappedTransactions;
            response.Successful = true;
            response.Message = "Reversals By Transaction Reference Number Retrieved";
            response.StatusCode = (int)HttpStatusCode.OK;
            return response;
        }
    }
    catch (OracleException ex)
    {
        _logger.Error("Failed to retrieve Reversals By Transaction Reference Number: " + ex.ToString());
        response.Message = $"Failed to retrieve Reversals By Transaction Reference Number: {ex.Message}";
        response.Successful = false;
        response.StatusCode = (int)HttpStatusCode.BadRequest;
        return response;
    }
    catch (Exception ex)
    {
        _logger.Error("Failed to retrieve Reversals By Transaction Reference Number: " + ex.ToString());
        response.Message = $"Failed to retrieve Reversals By Transaction Reference Number: {ex.Message}";
        response.Successful = false;
        response.StatusCode = (int)HttpStatusCode.BadRequest;
        return response;
    }
}

DTO:

public class IncomingIsoAutoReversalDto
{
    public string Pkey { get; set; }
    public string MsgType { get; set; }
    public string Pan { get; set; }
    public string ProcCode { get; set; }
    public decimal TransactionAmount { get; set; }
    public decimal SettlementAmount { get; set; }
    public decimal BillAmount { get; set; }
    public string FormattedTransactionAmount => TransactionAmount.ToString("0.00");
    public string FormattedSettlementAmount => SettlementAmount.ToString("0.00");
    public string FormattedBillAmount => BillAmount.ToString("0.00");
    public string TransactionDate { get; set; }
    public string Stan { get; set; }
    public string RetrievalRefNo { get; set; }
    public string ResponseCode { get; set; }
    public string TermId { get; set; }
    public string TransactionCurrencyCode { get; set; }
    public string TransactionDescription { get; set; }
    public string TransactionStatus { get; set; }   // WORK_PROGRESS
    public string DebitAccountNumber { get; set; }
    public string TransactionRefNo { get; set; }
    public string TermAddress { get; set; }
    public string SettlementCurrencyCode { get; set; }
}
oracle asp.net-core-webapi dapper
1个回答
0
投票

FF
不是日期的有效格式模型,因为它们没有小数秒。

如果您有带有小数秒的内容,那么您需要

TIMESTAMP
数据类型并使用
TO_TIMESTAMP
:

进行转换
TO_TIMESTAMP(DB_IN_TIME, 'YYYY:DD:MM HH24:MI:SS.FF')

注意:如果您将日期和时间存储在数据库中,那么将它们存储为字符串被认为是不好的做法,而应该将它们存储为

DATE
TIMESTAMP
TIMESTAMP WITH TIME ZONE
数据类型,酌情。

© www.soinside.com 2019 - 2024. All rights reserved.