Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 带有输出参数的ExecuteSqlCommand_Asp.net Mvc_Entity Framework_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 带有输出参数的ExecuteSqlCommand

Asp.net mvc 带有输出参数的ExecuteSqlCommand,asp.net-mvc,entity-framework,asp.net-mvc-3,Asp.net Mvc,Entity Framework,Asp.net Mvc 3,我正在ASP.NET MVC3应用程序中使用实体框架,并尝试使用以下代码: var token = ""; this.Database.ExecuteSqlCommand("exec dbo.MyUsp", new SqlParameter("token", token)); 我的存储过程签名是: CREATE PROCEDURE MyUSP(@token varchar(10) OUT) (...) 当我使用这段代码时,我得到一个错误,说参数“@token”是预期的,但没有提供 如何告诉E

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

var token = "";
this.Database.ExecuteSqlCommand("exec dbo.MyUsp", new SqlParameter("token", token));
我的存储过程签名是:

CREATE PROCEDURE MyUSP(@token varchar(10) OUT)
(...)
当我使用这段代码时,我得到一个错误,说参数“@token”是预期的,但没有提供


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

您需要在参数中指示方向。例如,尝试以下方法:

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

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

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();
var p=新的SqlParameter
{
ParameterName=“令牌”,
DbType=System.Data.DbType.String,
尺寸=100,
方向=System.Data.ParameterDirection.Output
};
var resp=this.Database.SqlQuery(“exec dbo.usp_GetRequestToken@token”,p);
返回resp.First();

下面是我使用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中):

//
///从数据库中获取下一个SID值
/// 
///X12345格式的字符串
公共字符串GetNextSId()
{
var parameter=new Devart.Data.Oracle.oracleparter(“io_SID”,Devart.Data.Oracle.OracleDbType.VarChar,ParameterDirection.Output);
this.Database.ExecuteSqlCommand(“BEGIN P_SID.SID_PGet(:io_SID);END;”,参数);
var sid=参数。值为字符串;
返回sid;
}

我用以下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;
        }
实体框架代码:

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

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

这对我很有用。没有在文本中明确地添加“@Param1,@Param2(etc)”,它抱怨没有提供参数。如果不在命令文本中添加“OUTPUT”,它将无法返回值。谢谢若存储过程只返回输出参数,那个么我必须使用EXECUTESQLCOMAND(此处仅显示)而不是SqlQuery。
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);