NpgsqlCommand转OracleCommand时出现InvalidCastException错误求助
类型转换异常:NpgsqlCommand无法转换为OracleCommand
错误信息
System.InvalidCastException: Unable to cast object of type 'Npgsql.NpgsqlCommand' to type 'Oracle.ManagedDataAccess.Client.OracleCommand'.
断点定位的问题代码行
bool add = !((OracleCommand)command).Parameters.Contains(name);
相关异步存储过程执行方法代码
public async Task SP_WEB_OBTIENE_DESTINO_PLACES_ASYNC(string V_DESTINO_ID) { MainBaseClass result = new MainBaseClass(); using (IDbConnection db = GetConnection()) { var par = new DynamicParameters(); par.Add("@V_DESTINATION_ID", V_DESTINATION_ID); var list = await db.QueryAsync<LugaresWeb>( "SELECT * FROM public.sp_web_gets_destination_places(v_destination_id => @v_destination_id)", par, commandType: CommandType.Text); result.datas = list.Cast<IDictionary<string, object?>>(); result.affectedRows = list.Count(); return result; } }
LugaresWeb类定义
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace guiapemexservices.Core.Models.Lugares { public class LugaresWeb { public string? placetype { get; set; } public string? Id { get; set; } public string? Name { get; set; } public string? Latitude { get; set; } public string? Length { get; set; } public string? Address { get; set; } public string? TurnType { get; set; } public string? SubType { get; set; } public string? ClassificationType { get; set; } public string? Active { get; set; } } }
解决思路
- 修正类型转换逻辑:当前
command是PostgreSQL的NpgsqlCommand实例,强行转换为Oracle的OracleCommand必然报错。改用通用的IDbCommand接口处理参数判断,兼容不同数据库类型:
或者针对Npgsql做类型匹配:bool add = !((IDbCommand)command).Parameters.Contains(name);if (command is NpgsqlCommand npgsqlCmd) { bool add = !npgsqlCmd.Parameters.Contains(name); // 后续业务逻辑 } - 检查数据库连接实例:确认
GetConnection()返回的是NpgsqlConnection(PostgreSQL连接),而非OracleConnection,避免连接类型与命令类型不匹配。 - 避免跨数据库类型混用:如果项目同时对接多数据库,需保证不同数据库操作使用对应的专属命令对象,不要硬编码某一种数据库的类型转换。
- 优先使用Dapper抽象层:尽量通过Dapper的
DynamicParameters处理参数,减少直接操作底层数据库命令对象的代码,降低数据库类型依赖。
内容的提问来源于stack exchange,提问作者Carl SA
相关产品推荐
相关产品推荐

