使用动态参数名称在多个数据库上执行存储过程

Posted

技术标签:

【中文标题】使用动态参数名称在多个数据库上执行存储过程【英文标题】:Execute stored procedure on multiple databases using dynamic parameter names 【发布时间】:2016-04-04 11:30:46 【问题描述】:

我有一个方法应该使用动态参数在 oracle 和 sql 服务器数据库上运行存储过程(你不知道参数名称)。

IDbCommand cmd = connection.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;

int i = 0;
foreach (string parameterName in names)
    
    var param2 = cmd.CreateParameter();

    param2.ParameterName = parameterName + "__" + i.ToString();
    param2.DbType = DbType.String;
    param2.Direction = ParameterDirection.Input;
    param2.Value = parameterName;
    cmd.Parameters.Add(param2);
    i++;

cmd.CommandText = "spName";

此代码适用于 Oracle 但 sql server 会抛出

过程或函数“pspName”需要参数 '@userID',未提供

因为我的代码中的参数名称不是'@userID'。 谢谢

【问题讨论】:

嗯,参数名是什么? 您可以尝试使用为您构建参数集合的方法 SqlCommandBuilder/OracleCommandBuilder DeriveParameters 来达到您的目标。但是你离家还有很长的路要走。您需要创建一个特定的 SqlCommandBuilder 或 OracleCommandBuilder,然后您需要创建一种可行的方法来设置参数值。如果您真的准备好完成所有这些工作,那么为什么不尝试学习一个 ORM 来帮助您从底层数据库系统中抽象出数据库代码呢? @oldprogrammer 名称无关紧要,当 sp 定义中的参数名称相同时,没有任何效果。 @steve 我正在使用实体框架...我认为我需要的是明确的 【参考方案1】:

Oracle 和 SQL Server 是有区别的:

Oracle 中的参数名称只需为名称即可,但对于 SQL Server,则需要在参数名称前添加@ 符号。

您需要以某种方式在代码中的某处考虑这一点。

【讨论】:

即使参数名称是“@name”,这也不起作用,我必须只输入“userID”,但我不知道 sp 定义中的参数名称

以上是关于使用动态参数名称在多个数据库上执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,

sql存储过程有什么用

oracle-PL/SQL2

按名称动态获取存储过程参数

数据库存储过程和触发器