C# выдает ошибку при вызове хранимой процедуры с выходной переменной, параметр не указан

#c# #sql #stored-procedures #azure-sql-database #output-parameter

#c# #sql #хранимые процедуры #azure-sql-database #output-параметр

Вопрос:

Я вызываю обобщенный метод на 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.Параметры в отладчике, он правильно отображает все три параметра, их имена, размеры, типы и т.д.

Итак, что я делаю не так? Почему он до сих пор не видит этот @table параметр?

Комментарии:

1. Вы null где-нибудь проходите?

2. Где указано имя @table параметра в C #?

3. Это действительно плохой способ создания параметров. Если вы хотите, чтобы эта вещь получила список параметров, просто передайте IDbParameterCollection с вашими параметрами, определенными в вызывающем. Вы пропустили параметр в вызывающем.

4. mjwills: Я не был, просто общий param0, param1 и т.д. Я добавил имена, и теперь это работает … вроде как. Я не получаю сообщение об ошибке, но я также не получаю правильный вывод, просто «~ n», который выглядит как последний бит того, что он должен возвращать. Пол: То, что вы видите, было результатом перепробования всего, что я мог придумать. Я вернусь к IDdParameterCollection.

5. Ладно, я виноват. Я не устанавливал «Значение» SqlParameter во всех своих попытках попробовать разные вещи. Итак, в конце концов, это были комментарии mjwills по поводу указания параметра @table. Как мне указать, что это был его ответ?

Ответ №1:

Действительно спасибо за комментарий и руководство @mjwills. Из сообщения об ошибке параметр @table не был указан.

Вы последовали его предложению и обнаружили, что вы не установили «Значение» SqlParameter во всех моих попытках попробовать разные вещи.

Мы рады слышать, что проблема решена. Я помогаю опубликовать это как ответ, и это может быть полезно для других членов сообщества.