简体   繁体   English

在应用程序代码与SQL中,带有OUTPUT参数的存储过程始终返回1

[英]Stored procedure with OUTPUT Parameter Always Returns 1 in Application Code vs SQL

In SQL Server Management Studio: 在SQL Server Management Studio中:

  1. Right click the procedure 右键单击程序
  2. Execute 执行
  3. Do not enter value for the OUTPUT parameter 不要输入OUTPUT参数的值
  4. Enter value for another string parameter 输入另一个字符串参数的值
  5. The correct value is returned (ex: 12+) 返回正确的值(例如:12+)

Calling code: 调用代码:

DECLARE @return_value int,
        @CustomerID bigint

EXEC @return_value = [dbo].[InsertCustomer]
            @CustomerID = @CustomerID OUTPUT,
            @Name = N'CustomerName'

SELECT @CustomerID as N'@CustomerID'
SELECT 'Return Value' = @return_value

In application code: 在应用程序代码中:

  1. Run the following code 运行以下代码
  2. The returned value for CustomerID is always 1 CustomerID的返回值始终为1

Code: 码:

ObjectParameter ob = new ObjectParameter("CustomerID", typeof(long));
var CustomerID = db.InsertCustomer(ob, "CustomerName");

I attempted to change the new ObjectParameter(,) second parameter by passing a type and often object by value (ex: 0, 1 etc) but with no avail. 我试图通过传递类型(通常是按值(例如:0、1等),但无济于事)来更改新的ObjectParameter(,)第二个参数。

What could have went wrong here? 这里可能出了什么问题?

Update : 更新

This is how the Entity Framework procedure code look like: 实体框架过程代码如下所示:

public virtual int InsertCustomer(ObjectParameter customerID, string name)
{
    var nameParameter = name != null ?
            new ObjectParameter("Name", name) :
            new ObjectParameter("Name", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("InsertCustomer", customerID, nameParameter);
}

Straight ADO : 直ADO

Please refer to this link. 请参考此链接。 . You need to specify your output parameter in the proc and you need to specify it in the calling code. 您需要在proc中指定输出参数,并且需要在调用代码中指定输出参数。

SqlParameter outParam = new SqlParameter("CustomerID", 0);

using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["StringName"].ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("InsertCustomer", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;              
        cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = CustomerName;
                    cmd.Parameters.Add(outParam.ParameterName, SqlDbType.BigInt).Direction = ParameterDirection.Output;                 
        con.Open();

        var CustomerID = Convert.ToInt64(cmd.Parameters["CustomerID"].Value);
    }
}

Entity Framework : 实体框架

Refer to this link 参考此链接

ObjectParameter ob = new ObjectParameter("CustomerID", 0);

// Wrong
var CustomerID = db.InsertCustomer(ob, "CustomerName");

// Right
db.InsertCustomer(ob, "CustomerName");
var CustomerID = (long)ob.Value;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM