InvalidCastException 将十进制数组作为参数传递给存储过程时出现 InvalidCastException

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

我正在尝试使用 OracleCommand 使用 .NET Core 8 执行 SP,具有以下 SP 定义

PROCEDURE SPName(
    ID IN Int,
    BID IN Varchar2,
    Secroleid IN Decimal,
    Site IN Varchar2
  ) AS

我的调用过程的 C# 代码如下所示

public async Task<ProductUserRolesReplyItem> SaveProductUserRolesMultiplePcsNew(decimal pcid, List<ProductUserRoleSaveItem> productUserRoles)
{

    
    var query = string.Empty;
    ProductUserRolesReplyItem? productUserRolesReplyItem = null;
    var connectionstring = _appDBContext.GetConn();
    try
    {
        using (var conn = connectionstring)
        {


            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            OracleCommand command = new OracleCommand
            {

                Connection = conn,
                CommandType = CommandType.StoredProcedure,
                CommandText = "SPName",
                BindByName = true
            };



                foreach (ProductUserRoleSaveItem pURole in productUserRoles)
                {

                    var numRecs = pURole.ProductUserRoles.Count();
                    var ids = new string[numRecs];
              var roleids = new Decimal[numRecs];
                var sites = new string[numRecs];
                    var i = 0;

                    foreach (var productUserRole in pURole.ProductUserRoles)
                    {
                        idsids[i] = productUserRole.Idsid;
                   ids[i] = productUserRole.Role.Security_Role_Id;
                        sites[i++] = productUserRole.Site;
                   

                }
                
                command.Parameters.Add(new OracleParameter("ID", OracleDbType.Decimal, ParameterDirection.Input)).Value = pcid;
                command.Parameters.Add(new OracleParameter("BID", OracleDbType.Varchar2, ParameterDirection.Input)).Value = ids;
                command.Parameters.Add(new OracleParameter("Secroleid", OracleDbType.Decimal, ParameterDirection.Input)).Value = roleids.ToArray();
                command.Parameters.Add(new OracleParameter("Site", OracleDbType.Varchar2, ParameterDirection.Input)).Value = sites;
                if (numRecs > 0)
                    {

                    command.ExecuteNonQueryAsync().Wait();
                    command.Transaction.Commit();
                    }
                }
            }
        
    }
    catch (Exception ex)
    {
        return new ProductUserRolesReplyItem
        {
            IsSuccess = false,
            Message = System.String.Format("Error encountered while saving product user roles: {0}", ex.Message)
        };
    }
    return new ProductUserRolesReplyItem { IsSuccess = true };

}

当我尝试在 command.ExecuteNonQueryAsync().Wait(); 中调用 SP 时我收到以下错误: InvalidCastException:无法将类型“Oracle.ManagedDataAccess.Types.OracleDecimal[]”的对象转换为类型“System.IConvertible”

无法理解如何纠正此错误?

c# oracle asp.net-core
1个回答
0
投票

在 Oracle 中,标识符区分大小写。但是,当您使用不带引号的标识符时,Oracle 会显得不区分大小写,因为它会隐式地将小写和混合大小写的不带引号的标识符转换为大写。

因此:

PROCEDURE SPName(
  ID        IN Int,
  BID       IN Varchar2,
  Secroleid IN Decimal,
  Site      IN Varchar2
) AS

相当于:

PROCEDURE SPNAME(
  ID        IN Int,
  BID       IN Varchar2,
  SECROLEID IN Decimal,
  SITE      IN Varchar2
) AS

因此您的代码可能需要使用大写标识符和单个值:

OracleCommand command = new OracleCommand
{
  Connection = conn,
  CommandType = CommandType.StoredProcedure,
  CommandText = "SPNAME",
  BindByName = true
};

command.Parameters.Add(
  new OracleParameter("ID", OracleDbType.Decimal, ParameterDirection.Input)
).Value = pcid;
command.Parameters.Add(
  new OracleParameter("BID", OracleDbType.Varchar2, ParameterDirection.Input)
).Value = productUserRoles[0].ProductUserRoles[0].Idsid;
command.Parameters.Add(
  new OracleParameter("SECROLEID", OracleDbType.Decimal,  ParameterDirection.Input)
).Value = productUserRoles[0].ProductUserRoles[0].Role.Security_Role_Id;
command.Parameters.Add(
  new OracleParameter("SITE", OracleDbType.Varchar2, ParameterDirection.Input)
).Value = productUserRoles[0].ProductUserRoles[0].Site;

command.ExecuteNonQueryAsync().Wait();
command.Transaction.Commit();

注意:未经测试,但它应该让您大致了解如何简化问题并尝试使最小的单记录示例正常工作。

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