Можно ли использовать выходные параметры с ExecuteQuery <T>? - PullRequest
2 голосов
/ 06 февраля 2009

Обычно, когда вы хотите вызвать хранимую процедуру напрямую через 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);

Но что, если один из параметров является выходной переменной? Можно ли вернуть значение после запуска процедуры?

Ответы [ 3 ]

1 голос
/ 10 декабря 2010

Альпер Озцетин прав, вы можете отобразить StoredProcedures в * .dbml, и вы можете использовать StoredProcedures в качестве метода.

Ниже приведена демонстрационная работа с базой данных AdventureWorks, которая работает как для vs2008, так и для vs2010

В AdventureWorks я создал следующий процесс

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

0 голосов
/ 23 апреля 2009

Вам не нужно писать необработанный SQL для StoredProcedures в ExecuteQuery. Вы можете отобразить StoredProcedures в * .dbml и использовать StoredProcedures в качестве методов.

0 голосов
/ 18 февраля 2009

Я не уверен, но вы можете попытаться объявить переменную в запросе, передать ее в качестве выходного параметра и затем выбрать ее:

//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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...