【问题标题】:ExecuteSqlCommand with output parameter带输出参数的 ExecuteSqlCommand
【发布时间】:2011-07-28 15:40:36
【问题描述】:

我在 ASP.NET MVC3 应用程序中使用实体框架,我正在尝试使用以下代码:

var token = "";
this.Database.ExecuteSqlCommand("exec dbo.MyUsp", new SqlParameter("token", token));

我的存储过程签名是:

CREATE PROCEDURE MyUSP(@token varchar(10) OUT)
(...)

当我使用此代码时,我收到一条错误消息,指出参数“@token”是预期的,但未提供。

我如何告诉 EF 令牌参数是用于输出的?

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-mvc-3


    【解决方案1】:

    我最终使用它来让它工作,但我确信有一个更优化的方法:

    var p = new SqlParameter
    {
        ParameterName = "token",
        DbType = System.Data.DbType.String,
        Size = 100,
        Direction = System.Data.ParameterDirection.Output
    };
    var resp = this.Database.SqlQuery<String>("exec dbo.usp_GetRequestToken @token", p);
    
    return resp.First();
    

    【讨论】:

      【解决方案2】:
      var outParam = new SqlParameter();
      outParam.ParameterName = "OutPutParametname";
      outParam.SqlDbType = SqlDbType.Bit;//DataType Of OutPut Parameter
      outParam.Direction = ParameterDirection.Output;
      db.Database.ExecuteSqlCommand("EXEC ProcedureName @Param1,@Param2 OUTPUT", new SqlParameter("Param1", value), outParam);
      object outParamValue = Convert.ToBoolean(outParam.Value);
      

      【讨论】:

      • 这对我有用。没有在文本中明确输入“@Param1,@Param2 (etc)”,它抱怨没有提供参数。如果不在命令文本中输入“OUTPUT”,它就不会取回值。谢谢!
      • 如果存储过程只返回输出参数,我必须使用 ExecuteSqlCommand(此处显示)而不是 SqlQuery。
      【解决方案3】:

      需要在参数中指明方向。例如,尝试这样的操作:

      var p = new SqlParameter("token", token);
      p.Direction = ParameterDirection.InputOutput;
      this.Database.ExecuteSqlCommand("exec dbo.MyUsp", p);
      

      【讨论】:

        【解决方案4】:

        我使用以下 SQL 和实体框架代码解决了这个问题

        SP:

            ALTER PROCEDURE [dbo].[SaveSingleColumnValueFromGrid]
        (
            @TableName VARCHAR(200),
            @ColumnName VARCHAR (200),
            @CompareField VARCHAR(200),
            @CompareValue VARCHAR(200),
            @NewValue VARCHAR(200),
            @Result INT OUTPUT
        )
        AS
        BEGIN
            DECLARE @SqlString NVARCHAR(2000),
                    @id INTEGER = 0;
        
        
            IF @CompareValue = ''
                BEGIN
        
                    SET @SqlString = 'INSERT INTO ' + @TableName + ' ( ' + @ColumnName +  ' )  VALUES ( ''' + @NewValue + ''' ) ; SELECT @id = SCOPE_IDENTITY()';
                    EXECUTE sp_executesql @SqlString, N'@id INTEGER OUTPUT',  @id OUTPUT
                END
            ELSE
                BEGIN
                    SET @SqlString = 'UPDATE ' + @TableName + ' SET ' + @ColumnName +  ' = ''' + @NewValue + '''  WHERE ' + @CompareField +  ' = ''' + @CompareValue + '''';
                    EXECUTE sp_executesql @SqlString
                    set @id = @@ROWCOUNT
                END
        
        
            SELECT @Result = @id
        END
        

        实体框架代码:

        public FieldUpdateResult SaveSingleColumnValueFromGrid(string tableName, string tableSetFieldName, string updatedValue, string tableCompareFieldName, string uniqueFieldValue)
                {
        
                    var fieldUpdateResult = new FieldUpdateResult() ;
                    var isNewRecord = false;
        
                    if (string.IsNullOrWhiteSpace(uniqueFieldValue))
                    {
                        uniqueFieldValue = string.Empty;
                        isNewRecord = true;
                    }
                    using (var dbContext = new DBEntities())
                    {
                        var resultParameter = new SqlParameter("@Result", SqlDbType.Int)
                        {
                            Direction = ParameterDirection.Output
                        };
        
                        var recordsAffected = dbContext.Database.ExecuteSqlCommand("SaveSingleColumnValueFromGrid @TableName,@ColumnName,@CompareField,@CompareValue,@NewValue,@Result out",
                            new SqlParameter("@TableName", tableName),
                            new SqlParameter("@ColumnName", tableSetFieldName),
                            new SqlParameter("@CompareField", tableCompareFieldName),
                            new SqlParameter("@CompareValue", uniqueFieldValue),
                            new SqlParameter("@NewValue", updatedValue),
                            resultParameter);
        
                        fieldUpdateResult.Success = recordsAffected > 0;
                        if (isNewRecord)
                        {
                            fieldUpdateResult.NewId = (int)resultParameter.Value;
                        }
                        else
                        {
                            fieldUpdateResult.AffectedRows = (int)resultParameter.Value;
                        }
                    }
        
                    return fieldUpdateResult;
                }
        

        【讨论】:

          【解决方案5】:
          var db = new DBContext();
          var outParam = new SqlParameter
          {
              ParameterName = "@Param",
              DbType = System.Data.DbType.String,
              Size = 20,
              Direction = System.Data.ParameterDirection.Output
          };
          var r = db.Database.ExecuteSqlCommand("EXEC MyStoredProd @Param OUT",outParam );
          Console.WriteLine(outParam.Value);
          

          我看到每个人都缺少的主要部分是@Param 之后需要的 OUT 关键字。

          【讨论】:

            【解决方案6】:

            以下是我使用 DevArt 驱动程序为 Oracle 所做的事情。我有一个名为 P_SID.SID_PGet 的 package.proc,它返回一个字符串值。过程是:

            PROCEDURE SID_PGet(io_SID OUT varchar2) is
            Begin
               io_SID:=GetSID; -- GetSID just goes off and gets the actual value
            End;
            

            以下是我如何调用它并检索 SID 值(我首先将其与 EF 4.1 代码一起使用,此方法位于 DbContext 中):

            /// <summary>
            /// Get the next SID value from the database
            /// </summary>
            /// <returns>String in X12345 format</returns>
            public string GetNextSId()
            {
                var parameter = new Devart.Data.Oracle.OracleParameter("io_SID", Devart.Data.Oracle.OracleDbType.VarChar, ParameterDirection.Output);
                this.Database.ExecuteSqlCommand("BEGIN P_SID.SID_PGet(:io_SID); END;", parameter);
                var sid = parameter.Value as string;
            
                return sid;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多