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

C# getting error calling stored procedure with an output variable, parameter not supplied

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

Procedure or function 'TableScriptGenerate' expects parameter '@table', which was not supplied

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

    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 参数?

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

你听从了他的建议,发现你没有设置 SqlParameter 的“值”,因为我一直在尝试不同的东西。

我们很高兴得知问题已解决。我帮助 post 将此作为答案,这可能对其他社区成员有益。