在带有 Dapper 和 Oracle 数据库的 ASP.NET Core-6 中,我有一个要使用的存储过程。
我有这些 Nuget 包
Dapper 版本-2.0.123"
Oracle.ManagedDataAccess.Core”版本 3.21.100
但是,我收到了这个错误:
Severity Code Description Project File Line Suppression State
Error CS0246 The type or namespace name 'OracleDynamicParameters' could not be found (are you missing a using directive or an assembly reference?)
获取学生详细信息:
create or replace PROCEDURE "GET_STUDENT_DETAILS" (
sUserID IN VARCHAR DEFAULT NULL,
rResultSet OUT SYS_REFCURSOR
)
AS
nCheck NUMBER;
sUserIDC VARCHAR(100);
BEGIN
select instr(sUserID,'.') into nCheck from dual;
IF nCheck>0 THEN
SELECT CONCAT(sUserID,'@rotrim.com') into sUserIDC FROM DUAL;
OPEN rResultSet FOR
SELECT SU."USER_ID",
SU."USER_NAME",
SU."FIRST_NAME",
SU."LAST_NAME",
CFUF."EMAIL"
FROM PEPUSC.smtb_user su, PEPUSC.cstm_function_userdef_fields cfuf
WHERE su."USER_ID"||'~'=cfuf."REC_KEY"
AND cfuf."FUNCTION_ID"= 'SMDUSRDF'
AND SU. USER_NAME = sUserIDC
AND SU.USER_STATUS = 'E';
ELSE
OPEN rResultSet FOR
SELECT SU."USER_ID",
SU."USER_NAME",
SU."FIRST_NAME",
SU."LAST_NAME",
CFUF."EMAIL"
FROM PEPUSC.smtb_user su, PEPUSC.cstm_function_userdef_fields cfuf
WHERE su."USER_ID"||'~'=cfuf."REC_KEY"
AND cfuf."FUNCTION_ID"= 'SMDUSRDF'
AND SU.USER_ID = sUserID
AND SU.USER_STATUS = 'E';
END IF;
END;
主要代码:
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
using Dapper;
public class StudentRepository : IStudentRepository
{
private readonly IMapper _mapper;
private readonly IConfiguration _configuration;
private readonly ILogger<StudentRepository> _logger;
public StudentRepository(
IMapper mapper,
ILogger<StudentRepository> logger,
IConfiguration configuration
)
{
_mapper = mapper;
_logger = logger;
_configuration = configuration;
}
public IDbConnection Connection
{
get { return new OracleConnection(_configuration.GetConnectionString("DefaultConnection")); }
}
public async Task<Response<StudentResponseDto>> GetStudentByUserIdAsync(string sUserID)
{
var response = new Response<StudentResponseDto>();
try
{
using (IDbConnection _dbConnection = Connection)
{
_dbConnection.Open();
//
var parameters = new OracleDynamicParameters();
parameters.Add("sUserID", sUserID, OracleDbType.Varchar2, ParameterDirection.Input);
parameters.Add("rResultSet", OracleDbType.RefCursor, ParameterDirection.Output);
string query = "GET_STUDENT_DETAILS";
var student = await _dbConnection.QueryFirstOrDefaultAsync<StudentResponse>(query, parameters, commandType: CommandType.StoredProcedure);
if (fcubsHeader != null)
{
var studentDtos = _mapper.Map<StudentResponseDto>(fcubsHeader);
response.Successful = true;
response.Data = studentDtos;
response.StatusCode = (int)HttpStatusCode.OK;
return response;
}
else
{
response.Message = $"Data Not Found!";
response.Successful = true;
response.StatusCode = (int)HttpStatusCode.NoContent;
return response;
}
}
}
catch (OracleException ex)
{
response.Successful = false;
response.StatusCode = (int)HttpStatusCode.BadRequest;
return response;
throw;
}
catch (Exception ex)
{
response.Successful = false;
response.StatusCode = (int)HttpStatusCode.BadRequest;
return response;
throw;
}
}
}
如何解决这个问题?
从
Dapper或Oracle的实现来看,
OracleDynamicParameters
都不存在。
但是,从一些研究来看,有一个开发人员实现了这个
OracleDynamicParameters
来用Dapper查询Oracle存储过程。您可能已经阅读过这篇文章:使用 Dapper (C#) 调用 Oracle Store 过程并实现它。
如果您正在寻找纯粹的 Dapper 解决方案,则需要迁移代码:
OracleDynamicParameters
迁移到 DynamicParameters
OracleDbType
迁移到 DbType
OracleDbType
文档:
属性和OracleDbType
属性是链接的。因此,设置DbType
属性会将OracleDbType
属性更改为支持DbType
。DbType
您可以参考从OracleDbType推断DbType,作为将
OracleDbType
切换到DbType
的参考。
using System.Data;
var parameters = new DynamicParameters();
parameters.Add("sUserID", sUserID, dbType: DbType.String, direction: ParameterDirection.Input);
parameters.Add("rResultSet", null, dbType: DbType.Object, direction: ParameterDirection.Output);