2011-07-28 29 views
17

我使用實體框架在ASP.NET MVC3應用程序,我嘗試使用下面的代碼:ExecuteSqlCommand與輸出參數

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

我的存儲過程的簽名是:

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

當我使用這段代碼的時候,我收到一個錯誤,提示參數「@token」是預期的,但沒有提供。

如何告知EF令牌參數用於輸出?

回答

20

最後我用這個來得到它的工作,但我敢肯定有一個更好的方法:

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(); 
+0

我希望這將是正式的方式;) – danihp

8

您需要在參數中指示方向。例如,嘗試這樣的事情:

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

下面是我對甲骨文做使用DevArt驅動程序。我有一個名爲P_SID.SID_PGet的package.proc,它返回單個字符串值。我們把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; 
} 
9
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[This is for output]     OUTPUT", new SqlParameter("Param1", value), outParam); 
object outParamValue = Convert.ToBoolean(outParam.Value); 
+1

這爲我工作。沒有明確地在文本中加入「@Param1,@ Param2(etc)」,它抱怨說沒有提供參數。如果不在命令文本中輸入「OUTPUT」,它將不會返回值。謝謝! –

+0

如果存儲過程只返回輸出參數,則必須使用ExecuteSqlCommand(此處只顯示)而不是SqlQuery。 – bob

7

我解決了這個問題,用下面的SQL和Entity Framework代碼

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; 
     } 
+1

我忘了在參數名稱周圍輸入關鍵字,例如 「@Result out」。現在它可以工作。謝謝。 –

+1

這個'out'關鍵字也給我帶來了一些悲傷。 – puddinman13