我正在尝试使用 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; }
}
FF
不是日期的有效格式模型,因为它们没有小数秒。
如果您有带有小数秒的内容,那么您需要
TIMESTAMP
数据类型并使用 TO_TIMESTAMP
: 进行转换
TO_TIMESTAMP(DB_IN_TIME, 'YYYY:DD:MM HH24:MI:SS.FF')
注意:如果您将日期和时间存储在数据库中,那么将它们存储为字符串被认为是不好的做法,而应该将它们存储为
DATE
、TIMESTAMP
或 TIMESTAMP WITH TIME ZONE
数据类型,酌情。