【问题标题】:Is it possible to use output parameters with ExecuteQuery<T>?是否可以将输出参数与 ExecuteQuery<T> 一起使用?
【发布时间】:2009-02-05 21:16:08
【问题描述】:

一般情况下,当你想直接通过Linq to Sql调用存储过程时,可以使用ExecuteQuery方法:

result = dc.ExecuteQuery<MyTable>("Exec myStoredProcedure");

如果需要带参数调用,可以通过字符串替换的方式添加:

string query = "Exec myStoredProcedure ";
for (int i = 0; i < parameters.Count - 1; i++) {
  query += " {" + i + "},";
}
query = query.TrimEnd(',');
result = dc.ExecuteQuery<MyTable>(query, parameters);

但是如果其中一个参数是输出变量呢?程序运行后是否可以取回该值?

【问题讨论】:

    标签: sql linq-to-sql stored-procedures


    【解决方案1】:

    Alper Ozcetin 是对的,您可以在 *.dbml 中映射 StoredProcedures,并且可以使用 StoredProcedures 作为方法。

    下面是使用 AdventureWorks DB 的演示,适用于 vs2008 和 vs2010

    通过 AdventureWorks,我创建了以下 Proc

    CREATE PROC sp_test (@City  Nvarchar(60) , @AddressID int out  )
    AS
    SELECT TOP 10 * FROM Person.Address where City = @City
    select  top 1  @AddressID  = AddressID FROM Person.Address where City = @City
    

    然后我将 sp_test 添加到 dbml 并编写了以下程序

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.Linq;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
    
    
                DataClasses1DataContext dc = new DataClasses1DataContext("SomeSQLConnection);
    
                int? AddressID = null;
                ISingleResult<sp_testResult> result = dc.sp_test("Seattle", ref AddressID);
    
                foreach (sp_testResult addr in result)
                {
                    Console.WriteLine("{0} : {1}", addr.AddressID, addr.AddressLine1);
                }
                Console.WriteLine(AddressID);
    
    
            }
        }
    }
    

    这会产生以下输出

    23 : 6657 Sand Pointe Lane
    91 : 7166 Brock Lane
    92 : 7126 Ending Ct.
    93 : 4598 Manila Avenue
    94 : 5666 Hazelnut Lane
    95 : 1220 Bradford Way
    96 : 5375 Clearland Circle
    97 : 2639 Anchor Court
    98 : 502 Alexander Pl.
    99 : 5802 Ampersand Drive
    13079
    

    您会注意到 sp_test 方法的输入是 ref

    【讨论】:

      【解决方案2】:

      我不确定,但您可以尝试在查询中声明变量,将其作为输出参数传递,然后选择它:

      //assuming you out parameter is integer
      string query = "DECLARE @OUT INT ";
      query += " Exec myStoredProcedure ";
      for (int i = 0; i < parameters.Count - 1; i++) {
        query += " {" + i + "},";
      }
      //assuming the output parameter is the last in the list
      query += " @OUT OUT ";
      //select value from out param after sp execution
      query += " SELECT @OUT"
      

      【讨论】:

        【解决方案3】:

        您无需为 ExecuteQuery 中的 StoredProcedures 编写原始 SQL。您可以在 *.dbml 中映射 StoredProcedures,并且可以将 StoredProcedures 用作方法。

        【讨论】:

        • 据我所知,基于 dbml 的存储过程不支持输出参数。
        猜你喜欢
        • 2022-01-05
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2021-11-12
        • 2016-04-01
        • 2011-01-20
        相关资源
        最近更新 更多