是否可以在ExecuteQuery <t>?</t>中使用输出参数

时间:2009-02-05 21:16:09

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

通常,当您想通过Linq直接调用存储过程到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);

但是,如果其中一个参数是输出变量呢?在程序运行后是否可以恢复值?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

//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"

答案 2 :(得分:0)

您不需要在ExecuteQuery中为存储过程编写原始SQL。您可以在* .dbml中映射存储过程,并且可以将StoredProcedures用作方法。