C#使用输出变量调用存储过程时出错,未提供参数

Posted

技术标签:

【中文标题】C#使用输出变量调用存储过程时出错,未提供参数【英文标题】:C# getting error calling stored procedure with an output variable, parameter not supplied 【发布时间】:2021-03-15 11:24:57 【问题描述】:

我在 C# 中调用一个通用方法,该方法从带有输出变量的 Azure SQL 存储过程返回一个字符串。错误是:

过程或函数“TableScriptGenerate”需要参数“@table”,但未提供该参数

我将参数作为列表传递我的代码如下所示:

    static public string ReadSpData(string cnxn, string storedProcedure,List<string> paramName,List<string> paramValue, List<string> paramType, List<int> paramSize, List<string> paramDir)
    
        string rtn = "";
        int i = 0;

        try
        
            List<SqlParameter> sqlParam = new List<SqlParameter>();

            DbProviderFactory dbf = DbProviderFactories.GetFactory("System.Data.SqlClient");
            DbConnection dbcn = dbf.CreateConnection();
            dbcn.ConnectionString = cnxn;

            dbcn.Open();

            DbCommand dbcmd = dbcn.CreateCommand();

            for (i = 0; i < paramValue.Count; i++)
            
                SqlDbType sdt = SqlDbType.NVarChar;

                switch (paramType[i])
                
                    case "varchar":
                        sdt = SqlDbType.VarChar;
                        break;

                    case "char":
                        sdt = SqlDbType.Char;
                        break;

                    case "int":
                        sdt = SqlDbType.Int;
                        break;
                

                sqlParam.Add(new SqlParameter(paramName[i], sdt, paramSize[i]));
                sqlParam[sqlParam.Count - 1].ParameterValue = paramValue[i]; //edited

                switch (paramDir[i].ToLower())
                
                    case "input":
                        sqlParam[sqlParam.Count - 1].Direction = ParameterDirection.Input;
                        break;

                    case "output":
                        sqlParam[sqlParam.Count - 1].Direction = ParameterDirection.Output;
                        break;

                    case "return":
                        sqlParam[sqlParam.Count - 1].Direction = ParameterDirection.ReturnValue;
                        break;
                

                dbcmd.Parameters.Add(sqlParam[sqlParam.Count - 1]);
            

            dbcmd.CommandType = CommandType.StoredProcedure;
            dbcmd.CommandText = storedProcedure;

            dbcmd.ExecuteNonQuery();

            rtn = dbcmd.Parameters["@table_definition"].ToString(); //edited
        

storedProcedure = TableScriptGenerate
paramValue = 'path_person', 1, @tab
paramType = nvarchar, char, nvarchar
paramSize = 4000,1,4000
paramDir = input, input, output

被调用的存储过程如下所示:

ALTER PROCEDURE [dbo].[TableScriptGenerate]
    (@table nvarchar(4000) = NULL,
     @isExternal char = NULL,
     @table_definition nvarchar(4000) = NULL OUTPUT)
AS
BEGIN
    ...
    SET @table_definition = CONCAT(@preTbl, @sql, @post, '~/n')
END

我添加了输入参数的初始化,读到它们可能有帮助,但没有。当我在调试器中查看 dbcmd.Parameters 时,它会正确显示所有三个参数、它们的名称、大小、类型等。

那么,我做错了什么?为什么还是看不到@table参数?

【问题讨论】:

你在任何地方传递null吗? C#中@table参数名在哪里指定? 这是一个非常糟糕的创建参数的方法。如果你希望这个东西接收参数列表,只需传入一个 IDbParameterCollection 并在调用者中定义你的参数。你错过了调用者中的一个参数。 mjwills:我不是,只是通用的 param0、param1 等。我添加了名称,现在它可以工作了……有点。我没有收到错误,但我也没有得到正确的输出,只是“~\n”,它看起来像是它应该返回的最后一点。保罗:你看到的是尝试了我能想到的一切的结果。我会回到 IDdParameterCollection。 好吧,我的错。在我尝试不同的事情时,我并没有设置 SqlParameter 的“值”。因此,它的长短是关于指定 @table 参数的 mjwills 的 cmets。我如何指定他的答案是? 【参考方案1】:

非常感谢@mjwills 的评论和指导。从错误消息来看,没有提供参数@table

你听从了他的建议,发现你没有在我所有的尝试不同的事情上设置 SqlParameter 的“值”。

我们很高兴听到问题已解决。我帮助将其发布为答案,这可能对其他社区成员有益。

【讨论】:

以上是关于C#使用输出变量调用存储过程时出错,未提供参数的主要内容,如果未能解决你的问题,请参考以下文章

C# OraOLEDB 存储过程输出参数

c#调用Mysql带参数的存储过程

在 C# 中使用存储过程输出参数

从另一个存储过程调用 sp_addextendedproperty 时出错

调用SQL的存储过程时怎样输入时间类型的参数

创建存储过程时出错