【问题标题】:Return values from stored procedures in C#从 C# 中的存储过程返回值
【发布时间】:2008-12-29 19:53:20
【问题描述】:

我见过一些与此类似的问题,但没有一个是完全相同的。无论如何,我有一个以行结尾的存储过程,

select SCOPE_IDENTITY()
return

然后我通过调用executeScalar() 来获取值。这完美地工作。但是,我觉得以return select SCOPE_IDENTITY() 结尾会更正确(也不要为此返回值创建新参数)。这可能吗?

【问题讨论】:

    标签: c# sql database stored-procedures


    【解决方案1】:

    一般来说,有三种方法可以做到这一点...您可以做您正在做的事情 - 使用 Select - 实际上返回单行、单列结果集并让 ADO.Net 提取值你。或者

    您可以使用return语句返回值,(这种方法篡改了返回错误代码的返回值的常见用法模式)或

    您可以使用所谓的 OutPut 参数,(有效地将存储的 proc 传递给一个参数的引用,它(proc)可以填充一个值,然后在 proc 之后 ADO.net 调用代码可以使用该值返回...

    每个都有优点和缺点...我最喜欢第一个选项,因为它是最简单和最容易编码的...(它不是最高效的)

    在存储过程中使用输出参数的例子...

      Create Procedure MyProc
      @Name varchar(20),
      @DOB DateTime,
      @EmployeeId Integer Output = Null
      As
      Set NoCount On
    
         If @EmployeeId Is Null 
           Begin
              Insert Employees(Name, DateofBirth)
              Values (@Name, @DOB)
              Set @EmployeeId = Scope_Identity()
           End
         Else If Exists(Select * From Employees
                        Where EmployeeId =@EmployeeId)
           Begin
               Update Employees Set
                  Name = Isnull(@Name, Name),
                  DateOfBirth = IsNull(@DOB, DateOfBirth)
               Where EmployeeId = @EmployeeId
           End
         Else
            Raiserror('EmployeeId %d is missing or has been deleted.',
                       16, 1, @EmployeeId)
    
         Return 0
    

    当您从 ADO.Net 调用存储过程并将此参数添加到参数集合中时...有一个重载,它采用一个方法参数,该参数是一个名为 ParameterDirection 的枚举,它可以采用 ParameterDirection.InputOutput 或 ParameterDirection 的值.输出,(除其他外)

    【讨论】:

    • 您的第二种方式是我要问的方法,尽管您的评论表明输出参数可能更有效。你能提供更多细节吗?
    • 我会选择输出参数或结果集路由(select 语句)并回避使用返回值,这主要是因为 Charles 指出的原因。如果我记得,输出参数是返回单值到调用代码的最佳性能
    • 关于输出参数的文章在这里 - msdn.microsoft.com/en-us/library/ms378108(SQL.90).aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多