You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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接口处理参数判断,兼容不同数据库类型:
    bool add = !((IDbCommand)command).Parameters.Contains(name);
    
    或者针对Npgsql做类型匹配:
    if (command is NpgsqlCommand npgsqlCmd)
    {
        bool add = !npgsqlCmd.Parameters.Contains(name);
        // 后续业务逻辑
    }
    
  • 检查数据库连接实例:确认GetConnection()返回的是NpgsqlConnection(PostgreSQL连接),而非OracleConnection,避免连接类型与命令类型不匹配。
  • 避免跨数据库类型混用:如果项目同时对接多数据库,需保证不同数据库操作使用对应的专属命令对象,不要硬编码某一种数据库的类型转换。
  • 优先使用Dapper抽象层:尽量通过Dapper的DynamicParameters处理参数,减少直接操作底层数据库命令对象的代码,降低数据库类型依赖。

内容的提问来源于stack exchange,提问作者Carl SA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:32:23