【问题标题】:Stored procedure with OUTPUT Parameter Always Returns 1 in Application Code vs SQL带有 OUTPUT 参数的存储过程在应用程序代码与 SQL 中始终返回 1
【发布时间】:2017-02-07 18:40:47
【问题描述】:

在 SQL Server Management Studio 中:

  1. 右键单击程序
  2. 执行
  3. 不要为 OUTPUT 参数输入值
  4. 输入另一个字符串参数的值
  5. 返回正确的值(例如:12+)

调用代码:

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

在应用程序代码中:

  1. 运行以下代码
  2. CustomerID 的返回值始终为 1

代码:

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

我试图通过传递一个类型并且通常是按值传递对象(例如:0、1 等)来更改新的 ObjectParameter(,) 第二个参数,但没有成功。

这里可能出了什么问题?

更新

这是实体框架过程代码的样子:

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

【问题讨论】:

标签: c# sql-server entity-framework


【解决方案1】:

直ADO

请参考这个link.。你需要在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);
    }
}

实体框架

参考这个link

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

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

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

【讨论】:

  • 您能否解释一下“在...调用代码中指定您的输出参数”是什么意思?该参数已经在sql过程中指定,调用代码不确定。我用 EF 代码更新了问题。
  • 对于初学者来说,上面的内容是针对直接 ADO 的,我个人觉得使用存储过程更容易一些,但这是一个见仁见智的问题。这是一个可以帮助您的链接:stackoverflow.com/questions/22068027/…
  • 如果选择 EF 作为主要技术,我认为没有理由使用直接 ADO,因为它更冗长并且需要更多代码行。有几次,由于限制,我不得不从 EF 转向 ADO。但是,您的链接非常有帮助,特别是@Augis stackoverflow.com/a/41488387/2093880 的最后一个答案
  • 我可以看到您不想将 ADO 与 EF 一起使用,但从个人使用 ORM 的经验来看,有时直接为具有相互映射功能的存储过程编写 ado 会更容易将结果集放入 C# 对象中。对于我喜欢的存储过程,我还没有找到一个好的 ORM 解决方案。更多的代码行并不一定等于不好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2020-07-02
相关资源
最近更新 更多